Cod sursa(job #387893)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 28 ianuarie 2010 18:11:06
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include<cstdio>
#define N 1003
bool viz[N][N],a[N][N];
char s[N];
int dist[N][N],coada[N*N][2],x0,y0,x1,y1,p,u,maxx,n,m;
const int dx[]={0,0,1,-1};
const int dy[]={-1,1,0,0};
#define maxim(a,b) ((a>b)?(a):(b))
void citire()
{
	scanf("%d%d\n",&n,&m);
	for (int i=1; i<=n; ++i)
	{
		fgets(s,m+2, stdin);
		for (int j=0; j<m; ++j)
			if (s[j]=='.')//pot trece doar prin 1
				a[i][j+1]=true;
			else
				if (s[j]=='D')
				{
					coada[u][0]=i;
					coada[u++][1]=j+1;
				}
				else
				if (s[j]=='I')
				{
					x0=i;
					y0=j+1;
					//viz[x0][y0]=true;
					a[i][j+1]=true;
				}
				else
					if (s[j]=='O')
					{
						x1=i;
						y1=j+1;
						a[x1][y1]=true;
					}
	}
}
void bfs()
{
	int x[2],y[2];
	p=0;
	while (u!=p)
	{
		x[0]=coada[p][0];
		x[1]=coada[p++][1];
		for (int i=0; i<4; ++i)
		{
			y[0]=x[0]+dx[i];
			y[1]=x[1]+dy[i];
			if (a[y[0]][y[1]]&&!viz[y[0]][y[1]])
			{
				coada[u][0]=y[0];
				coada[u++][1]=y[1];
				dist[y[0]][y[1]]=1+dist[x[0]][x[1]];
				maxx=maxim(maxx,dist[y[0]][y[1]]);
				viz[y[0]][y[1]]=true;
			}
		}
	}
}
bool verific(int m)
{
	p=0; u=0;
	int x[2],y[2];
	coada[u][0]=x0;
	coada[u++][1]=y0;
	if (dist[x0][y0])
	return false;
	viz[x0][y0]=true;
	while (u!=p)
	{
		x[0]=coada[p][0];
		x[1]=coada[p++][1];
		for (int i=0; i<4; ++i)
		{
			y[0]=x[0]+dx[i];
			y[1]=x[1]+dy[i];
			if (a[y[0]][y[1]]&&!viz[y[0]][y[1]]&&dist[y[0]][y[1]]>=m)
			{
				coada[u][0]=y[0];
				coada[u++][1]=y[1];
				viz[y[0]][y[1]]=true;
			}
		}
	}
	if (viz[x1][y1])
		return true;
	return false;
}
void refac()
{
	for (int i=1; i<=n; ++i)
        for (int j=1; j<=m; ++j)
            viz[i][j]=false;
}
int caut()
{
	int i;
	refac();
	int pas=1<<20;
	for (i=0 ; pas ; pas>>=1)
	{
        if(verific(i+pas))
            i += pas;
        refac();
    }
    if (i)
        return i;
    return -1;
}
void afis(int d[N][N])
{
	for (int i=1;i<=n; ++i)
	{
		for(int j=1; j<=m; ++j)
			printf("%d ",d[i][j]);
		printf("\n");
	}
}
int main()
{
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	citire();
	bfs();
	//afis(dist);
	printf("%d\n",caut());
	return 0;
}