Cod sursa(job #1026843)

Utilizator costel93FMI - Dumea Eduard Constantin costel93 Data 12 noiembrie 2013 03:33:11
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <fstream>
#include <iostream>
#define nmax 1005

using namespace std;

ifstream fin  ( "barbar.in"  );
ofstream fout ( "barbar.out" );
 
int dist[1005][1005], care[1005][1005], X[1000005], Y[1000005];
 
int xi, yi, xf, yf, ic, sc, l, m, r, x, y, i, j, ok, dist_max = -1;
 
int N, M;
 
char c;
 
int dx[] = { 0, 1, 0, -1};
int dy[] = { 1, 0, -1, 0};

void citire()
{
	fin>>N>>M;
 
    for (i = 1; i <= N; i++)
        for (j = 1; j <= M; j++)
        {
            fin>>c;
			
			dist[i][j] = nmax;
			
			if( c == '*' )
				dist[i][j] = 0;                
			else
				if( c == 'D' )
                {
                    dist[i][j] = 0;
                    ++sc;                             
                    X[sc] = i;
                    Y[sc] = j;
                }
				else
					if( c == 'I' )
					{
						
						xi = i;
						yi = j;
					}
					else
						if( c == 'O' )
						{
							xf = i;
							yf = j;
						}
        }
}

void distante()
{
	 for ( ic = 1; ic <= sc; ic++ )
        for ( i = 0, x = X[ic], y = Y[ic]; i < 4; i++ )
            if (dist[x + dx[i]][y + dy[i]] > dist[x][y]+1 && x+dx[i] >= 1 && x+dx[i] <= N && y+dy[i] >= 1 && y+dy[i] <= M)
            {
                dist[x + dx[i]][y + dy[i]] = dist[x][y] + 1;
                sc++;
                X[sc] = x + dx[i];
                Y[sc] = y + dy[i];
            }
}
 
int test( int m )
{
    if (dist[xi][yi] < m || dist[xf][yf] < m) 
		return 0;
 
    for ( ic = sc = 0, X[ic] = xi, Y[ic] = yi; ic <= sc && care[xf][yf] != m; ic++)
    {
        x = X[ic];
        y = Y[ic];
 
        for (i = 0; i < 4; ++i)
            if (x+dx[i] >= 1 && x+dx[i] <= N && y+dy[i] >= 1 && y+dy[i] <= M && care[x + dx[i]][y + dy[i]] != m && dist[x+dx[i]][y+dy[i]] >= m)
            {
                sc++;
                X[sc] = x+dx[i];
                Y[sc] = y+dy[i];
                care[x+dx[i]][y+dy[i]] = m;
            }
    }
 
    if (care[xf][yf] == m) 
		return 1;
 
    return 0;
}

void cautare(int st, int dr)
{
	int m = (st + dr)/2;

	if( st > dr )
		return;
	else
	{
		if( ! test (m) )
			cautare(st, m-1);
		else
		{
			dist_max = m;
			cautare(m+1, dr);
		
		}
	}
}
int main()
{
    citire();
	distante();
	
	int max = M;
	if( N>M )
		max=N;
 
    cautare(1, max);
	fout<<dist_max;
 
    return 0;
}