Cod sursa(job #419257)

Utilizator bora_marianBora marian bora_marian Data 17 martie 2010 10:49:42
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include<fstream>
using namespace std;
int n,m;
int a[1003][1003],starti,startj,b[1003][1003],c[1003][1003];
struct asa{
    int pti;
    int ptj;};
int di[4]={0,0,-1,1},dj[4]={-1,1,0,0},dr,st;	
asa coada[100000];
void bfs();
void bfs1();
int main()
{
	ifstream fin ("barbar.in");
	ofstream fout("barbar.out");
	fin>>n>>m;
	int i,j;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
		{
			char c;
			fin>>c;
			if(c=='.')
				a[i][j]=0;
			if(c=='*')
				a[i][j]=-1,b[i][j]=-1;
			if(c=='D')
				a[i][j]=1,coada[++dr].pti=i,coada[dr].ptj=j,b[i][j]=0;
			if(c=='I')
				starti=i,startj=j;
		}
	//fout<<dr<<endl;
	bfs();
    bfs1();
	//for(i=1;i<=n;i++)
	//{	
		//for(j=1;j<=n;j++)
	//	   fout<<c[i][j]<<" ";
	//fout<<endl;
	//}	
	fout<<c[starti][startj];
	return 0;
}	
void bfs()
{
  st=1;
  int k;
  while(st<=dr)
  {
    for(k=0;k<=3;k++)
	{
		int ii,jj;
		ii=coada[st].pti+di[k];
		jj=coada[st].ptj+dj[k];
		if(ii>=1 && ii<=n && jj>=1 && jj<=m && a[ii][jj]==0)
		{
			if(b[ii][jj]==0 || b[ii][jj]>b[coada[st].pti][coada[st].ptj]+1)
				b[ii][jj]=b[coada[st].pti][coada[st].ptj]+1;
			coada[++dr].pti=ii;
			coada[dr].ptj=jj;
		    a[ii][jj]=1;
		}
	}
	st++;
  }
}
void bfs1()
{
	st=1;dr=1;
	coada[1].pti=starti;
	coada[1].ptj=startj;
	int k;
	while(st<=dr)
	{
		for(k=0;k<=3;k++)
		{
		    int ii,jj;
            ii=coada[st].pti+di[k];
		    jj=coada[st].ptj+dj[k];
		    if(ii>=1 && ii<=n && jj>=1 && jj<=m && b[ii][jj]>0)
		    {	  
				if(c[ii][jj]==0)
				{	
					coada[++dr].pti=ii;
				    coada[dr].ptj=jj;
					if(b[coada[st].pti][coada[st].ptj]>b[ii][jj])
						c[ii][jj]=b[ii][jj];
					else
						c[ii][jj]=b[coada[st].pti][coada[st].ptj];
					
				}	
		        else
				    if(c[ii][jj]<c[coada[st].pti][coada[st].ptj])
					    c[ii][jj]=c[coada[st].pti][coada[st].ptj];
			}
		}
		st++;
	}
}