Cod sursa(job #974563)

Utilizator Kira96Denis Mita Kira96 Data 17 iulie 2013 15:38:36
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<fstream>
#include<queue>
#define N 1010
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int dx[]={0,1,-1,0,0};
int dy[]={0,0,0,1,-1};
queue<int> qx,qy;
int dr,st,e[N][N],i,j,n,m,mij,sol,xi,yi,D[N][N],xf,yf,yc,xc,x,y;
bool viz[N][N],c[N][N];
char ch;
void prec()
{
	while(!qx.empty())
	{
		x=qx.front();y=qy.front();
		qx.pop();qy.pop();
		for(i=1;i<=4;++i)
		{
			xc=x+dx[i];
			yc=y+dy[i];
			if(xc<1||yc<1||xc>n||yc>m||e[xc][yc]||c[xc][yc])
				continue;
			e[xc][yc]=e[x][y]+1;
			qx.push(xc); qy.push(yc);
		}
	}
}
int bfs()
{
	qx.push(xi);
	qy.push(yi);
	D[xi][yi]=e[xi][yi];
	while(!qx.empty())
	{
		x=qx.front();y=qy.front();
		viz[x][y]=1;
		qx.pop();qy.pop();
		for(i=1;i<=4;++i)
		{
			xc=x+dx[i];
			yc=y+dy[i];
			if(xc<1||yc<1||xc>n||yc>m||c[xc][yc]||D[x][y]<D[xc][yc])
				continue;
			if(!D[xc][yc])
			{
				D[xc][yc]=min(D[x][y],e[xc][yc]);
				qx.push(xc);
				qy.push(yc);
				continue;
			}
			if(D[x][y]<=e[xc][yc]&&D[x][y]>D[xc][yc])
				D[xc][yc]=D[x][y];
			else
				continue;
			qx.push(xc);
			qy.push(yc);
		}
	}
	if(D[xf][yf])
		return D[xf][yf];
	else
		return -1;
}
int main()
{
	f>>n>>m;
	for(i=1;i<=n;++i)
		for(j=1;j<=m;++j)
		{
			f>>ch;
			if(ch=='D')
			{
				qx.push(i);
				qy.push(j);
				c[i][j]=1;
			}
			else
			if(ch=='I')
				xi=i,yi=j;
			else
			if(ch=='O')
				xf=i,yf=j;
			else
			if(ch=='*')
				c[i][j]=1;
		}
	prec();
	sol=bfs();
	g<<sol;
	return 0;
}