Cod sursa(job #419820)

Utilizator bora_marianBora marian bora_marian Data 18 martie 2010 01:04:12
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 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();
int bfs1(int val,int cacat);
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();
	int f=b[finishi][finishj],pp=0,rez,kk;
	for(i=1;i<=f;i++)
	{
		if(i%2==0)
			kk=1;
		else
	        kk=0;
		if(bfs1(i,kk)==1)
			rez=i;
	}
	fout<<rez;
	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,int cacat)
{
	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(ii==finishi && jj==finishj && b[ii][jj]>=val)
					return 1;
				if(b[ii][jj]>=val && c[ii][jj]==cacat)
				{
					coada[++dr].pti=ii;
					coada[dr].ptj=jj;
					if(cacat==1)
						c[ii][jj]=0;
					else
						c[ii][jj]=1;
				}
			    
			}
		}
		st++;
	}

return 0;
}