Cod sursa(job #420167)

Utilizator bora_marianBora marian bora_marian Data 18 martie 2010 16:53:48
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 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[1000000];
void bfs();
int bfs1(int val);
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;
		}
	bfs();
	int valoare=1,gata=0;
	if(bfs1(1)==0)
		fout<<"-1";
	else
		for(i=1;i<=n;i++)
		    for(j=1;j<=n;j++)
			   c[i][j]=0;

	while(gata==0)
	{	
	  valoare++;
 	   if(bfs1(valoare)==0)
		   gata=1;
	   for(i=1;i<=n;i++)
		   for(j=1;j<=n;j++)
			   c[i][j]=0;
	}	   
	fout<<valoare-1;
	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++;
  }
}
int bfs1(int val)
{
	st=1;dr=1;
	coada[1].pti=starti;
	coada[1].ptj=startj;
	c[starti][startj]=1;
	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(ii==finishi && jj==finishj && b[ii][jj]>=val)
					return 1;
				if(b[ii][jj]>=val && c[ii][jj]==0)
				{
					coada[++dr].pti=ii;
					coada[dr].ptj=jj;
					c[ii][jj]=1;
				}
			    
			}
		}
		st++;
	}

return 0;
}