Cod sursa(job #419796)

Utilizator bora_marianBora marian bora_marian Data 17 martie 2010 23:46:44
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<fstream>
using namespace std;
int n,m;
int a[1003][1003],starti,startj,b[1003][1003],c[1003][1003],finishi,finishj;
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;
			if(c=='O')
				finishi=i,finishj=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[finishi][finishj];
	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;
	c[starti][startj]=b[starti][startj];
	while(st<=dr)
	{
		int k;
		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)
			{	
				if(c[ii][jj]==0 && b[ii][jj]>0)
				{
					coada[++dr].pti=ii;
					coada[dr].ptj=jj;
					if(c[coada[st].pti][coada[st].ptj]>b[ii][jj])
						c[ii][jj]=b[ii][jj];
					else
						c[ii][jj]=c[coada[st].pti][coada[st].ptj];
				}	
			    //if(c[ii][jj]!=0 && b[ii][jj]>0)
		          //  if(c[ii][jj]<c[coada[st].pti][coada[st].ptj])
					//    c[ii][jj]=c[coada[st].pti][coada[st].ptj];
			}
		}
		st++;
	}
}