Cod sursa(job #43965)

Utilizator c_sebiSebastian Crisan c_sebi Data 30 martie 2007 18:55:16
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <stdio.h>
#define MAX 1002

int a[MAX][MAX], C[MAX*MAX], viz[MAX*(MAX+1)+MAX+1], n, m, Sf=0, Inc=0, pi, pj, fi, fj;
int di[]={-1, 1, 0, 0}, dj[]={0, 0, -1, 1};

void read()
{
	int i, j;
	char ch;
	FILE *f=fopen("barbar.in", "r");
	fscanf (f, "%d %d", &n, &m);
	for (i=1; i<=n; i++)
	  {fscanf (f, "\n");
		for (j=1; j<=m; j++)
			{
				fscanf (f, "%c", &ch);
				if (ch=='.') a[i][j]=-1;
				else if (ch=='*') a[i][j]=-2;
				else if (ch=='D')
					{
						a[i][j]=0;
						C[Sf++]=i*(m+1)+j;
					}
				else if (ch=='I') {a[i][j]=-1; pi=i; pj=j; }
				else if (ch=='O') {a[i][j]=-1; fi=i; fj=j; }
			}
		}
	for (i=0; i<=m+1; i++)
		a[0][i]=a[n+1][i]=-2;
	for (i=0; i<=n+1; i++)
		a[i][0]=a[i][n+1]=-2;
}

void lee()
{
	int i, j, ii, jj, k;
	while (Inc < Sf)
		{
			i = C[Inc]/(m+1); j = C[Inc]%(m+1); Inc++;
			for (k=0; k<4; k++)
				{
					ii=i+di[k]; jj=j+dj[k];
					if (a[ii][jj]==-1)
						{
							a[ii][jj] = a[i][j]+1;
							C[Sf++] =  ii*(m+1)+jj;
						}
				}
		}
}

int bfs (int x)
{
	int i, j, ii, jj, k;
	for (i=1; i<=n*(m+1)+n+1; i++) viz[i]=0;
	Inc=0; Sf=1;
	C[0]=pi*(m+1)+pj;
	viz[C[0]]=1;
	while (Inc < Sf)
		{
			i = C[Inc]/(m+1); j = C[Inc]%(m+1); Inc++;
			if (i == fi && j == fj) return 1;
			for (k=0; k<4; k++)
				{
					ii=i+di[k]; jj=j+dj[k];
					if (a[ii][jj] >= x && !viz[ii*(m+1)+jj])
						C[Sf++] =  ii*(m+1)+jj, viz[C[Sf-1]]=1;
				}
		}
	return 0;
}


int main()
{
	int st=0, dr, mij, ok=0;
	read();
	lee ();
	dr=m*n;
	while (dr-st>1)
		{
			mij = (dr+st)>>1;
			if ( bfs(mij) ) {st=mij; ok=1; }
			else dr=mij;
		}
	if (!ok && bfs(0)) {ok=1; mij=0; }
	FILE *g=fopen("barbar.out", "w");
	if (ok) fprintf (g, "%d\n", st);
	else fprintf (g, "-1\n");
	fclose(g);
	return 0;
}