Cod sursa(job #116305)

Utilizator rethosPaicu Alexandru rethos Data 18 decembrie 2007 13:43:14
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <fstream.h>
#include <stdio.h>
#define NMAX 1001
#define INF 1001
struct point { int x,y;} v[NMAX*NMAX],k;
char a[NMAX][NMAX];
int dist[NMAX][NMAX];
int mat[NMAX][NMAX];
int vx[]={-1,0,1,0};
int vy[]={0,-1,0,1};
int lee[NMAX][NMAX];
int r,c;
void calc(int x,int y)
{ int pr=1,ult=1,i,j;
  for (i=1;i<=r;i++)
	for (j=1;j<=c;j++)
		{ lee[i][j]=-1;
		  if (a[i][j]=='*') lee[i][j]=-2;
		}
  lee[x][y]=0;
  v[1].x=x;
  v[1].y=y;
  while (pr<=ult)
	{ k=v[pr++];
	  for (i=0;i<=3;i++)
		if (lee[k.x+vx[i]][k.y+vy[i]]==-1)
			{ v[++ult].x=k.x+vx[i];
			  v[ult].y=k.y+vy[i];
			  lee[v[ult].x][v[ult].y]=lee[k.x][k.y]+1;
			}
	}
  for (i=1;i<=r;i++)
	for (j=1;j<=c;j++)
		if (lee[i][j]<dist[i][j]&&lee[i][j]>=0)
			dist[i][j]=lee[i][j];
}
int main()
{ int i,j,ii,ij,fi,fj;
  long pr,ult;
  char ch;
  ifstream f("barbar.in");
  ofstream g("barbar.out");
  f>>r>>c;
  f.get();
  for (i=1;i<=r;i++)
	{ a[i][0]=' ';
	  for (j=1;j<=c;j++)f>>a[i][j];
	  f.get();
	}
  f.close();
  for (i=0;i<=r+1;i++)
	{ a[i][0]='*';
	  a[i][c+1]='*';
	}
  for (j=0;j<=c+1;j++)
	{ a[0][j]='*';
	  a[r+1][j]='*';
	}
  for (i=1;i<=r;i++)
	for (j=1;j<=c;j++)
	       {if (a[i][j]=='I') { ii=i;ij=j;}
		if (a[i][j]=='0') { fi=i;fj=j;}
	       }
  for (i=1;i<=r;i++)
	for (j=1;j<=c;j++)
		dist[i][j]=INF;
  for (i=1;i<=r;i++)
	for (j=1;j<=c;j++)
		if (a[i][j]=='D')
			calc(i,j);
  for (i=1;i<=r;i++)
	for (j=1;j<=c;j++)
		mat[i][j]=-1;
  pr=ult=1;
  v[1].x=ii;
  v[1].y=ij;
  mat[ii][ij]=dist[ii][ij];
  while(pr<=ult)
	{ k=v[pr++];
	  for (i=0;i<=3;i++)
		if (a[k.x+vx[i]][k.y+vy[i]]!='*'&&mat[k.x+vx[i]][k.y+vy[i]]<mat[k.x][k.y])
			{ v[++ult].x=k.x+vx[i];
			  v[ult].y=k.y+vy[i];
			  mat[v[ult].x][v[ult].y]=mat[k.x][k.y];
			  if (dist[v[ult].x][v[ult].y]<mat[v[ult].x][v[ult].y])
				mat[v[ult].x][v[ult].y]=dist[v[ult].x][v[ult].y];
			}
	}
  g<<mat[fi][fj];
  g.close();
  return 0;
}