Cod sursa(job #412875)

Utilizator mihai995mihai995 mihai995 Data 6 martie 2010 20:21:56
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
struct punct{short int lin,col;};
const short int dl[]={-1,0,1,0};
const short int dc[]={0,1,0,-1};
punct coada[1000000];
int dist[1001][1001],v[1001][1001];

void lee(int u)
{
	punct x,y;
	int i,p=1;
	while (p!=u)
	{
		x=coada[p++];
		for (i=0;i<4;i++)
		{
			y.lin=x.lin+dl[i];
			y.col=x.col+dc[i];
			if (dist[y.lin][y.col]>v[x.lin][x.col]+1)
			{
				coada[u++]=y;
				v[y.lin][y.col]=v[x.lin][x.col]+1;
			}
		}
	}
}

void lee_fin(punct x,punct z)
{
	punct y;
	int i,p=0,u=0,q;
	coada[++u]=x;
	while (p!=u)
	{
		x=coada[p++];
		for (i=0;i<4;i++)
		{
			y.lin=x.lin+dl[i];
			y.col=x.col+dc[i];
			q=max(dist[y.lin][y.col],v[x.lin][x.col]);
			if (q>v[y.lin][y.col])
			{
				v[y.lin][y.col]=q;
				if (y.lin!=z.lin || y.col!=z.col) coada[u++]=y;
			}
		}
	}
	out<<v[z.lin][z.col];
}

int main()
{
	int n,i,u=1,m,j;
	char c;
	punct x,z;
	in>>n>>m;
	for (i=0;i<=m+1;i++)
	{
		v[0][i]=-1;
		dist[0][i]=32000;
		v[n+1][i]=-1;
		dist[n+1][i]=32000;
	}
	for (i=0;i<=n+1;i++)
	{
		v[i][0]=-1;
		dist[i][m+1]=32000;
		dist[i][0]=32000;
		v[i][n+1]=-1;
	}
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
		{
			in>>c;
			switch(c)
			{
				case '.':;dist[i][j]=32000;break;
				case '*':dist[i][j]=-1;break;
				case 'D':coada[u++].lin=i;coada[u].col=j;dist[i][j]=0;break;
				case 'I':x.lin=i;x.col=j;break;
				case '0':z.lin=i;z.col=j;break;
			}
		}
	lee(u);
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
			v[i][j]=dist[i][j];
	lee_fin(x,z);
	return 0;
}