Cod sursa(job #399199)

Utilizator ConsstantinTabacu Raul Consstantin Data 19 februarie 2010 23:32:34
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<fstream.h>
#include<queue>
#include<string.h>
#define min(a,b) a<b?a:b
using namespace std;

queue<int> X,Y;

int d[ 1002 ][ 1002 ],D[ 1002 ][ 1002 ],xi,yi,xf,yf,i,j,k,l,m,n,A,b,p,x,y,x2,y2;
int dx[] = {0,0,1,0,-1},dy[] = {0,1,0,-1,0};
int viz[ 1002 ][ 1002];
char a;
ifstream f("barbar.in");
ofstream g("barbar.out");


int main(){

	f>>n>>m;
	memset(D,1000,sizeof(D));
	for(i = 1; i <= n ; i++)
		for(j  = 1; j <= m ; j++)
			{f>>a;
			if(a == '*')
				{d[i][j] = 1 << 30;
				viz[i][j] = 1;
				D[i][j] = 1<<30;
				}
			else
			if(a == 'D'){
				X.push(i);
				Y.push(j);
				p++;
				viz[i][j] = 1;
				}
			if(a == 'I')
				xi = i,yi = j;
			else
			if(a == 'O')
				xf = i,yf = j;
			}
			
// calc drum minim
			
	while(p)
		{x = X.front();
		y = Y.front();
		for(i = 1 ; i <= 4 ; i++)
			{x2 = x + dx[i];
			y2 = y + dy[i];
			if(!viz[x2][y2] && 1 <= x2 && x2 <= n && 1 <= y2 && y2 <= m && !viz[x2][y2])
				{d[x2][y2] = d[x][y] + 1;
				viz[x2][y2] = 1;
				X.push(x2);
				Y.push(y2);
				p++;
				}
			}
		X.pop();
		Y.pop();
		p--;
		}
		
memset(viz,0,sizeof(viz));
X.push(xi);
Y.push(yi);
p++;
D[xi][yi] = d[xi][yi];
viz[xi][yi] = 1;
D[xf][yf] = -1;
while(p)
	{x = X.front();
	y = Y.front();
	
	for(i = 1 ; i <= 4 ; i++)
		{x2 = x + dx[i];
		y2 = y + dy[i];
		A = min(D[x][y],d[x2][y2]);
		if(A > D[x2][y2] && 1<= x2 && x2 <= n && 1<= y2 && y2 <= m)
			{D[x2][y2] = A;
			if(!viz[x2][y2])
				{viz[x2][y2] = 1;
				p++;
				X.push(x2);
				Y.push(y2);
				}
			}
		}
	X.pop();
	Y.pop();
	p--;
	viz[x][y] = 0;
	}

g<<D[xf][yf];

return 0;}