Cod sursa(job #560471)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 18 martie 2011 15:21:16
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <stdio.h>
#define maxn 1005
#define oo 200000000
#include <queue>
using namespace std;

const int dx[5]={0,1,0,-1};
const int dy[5]={1,0,-1,0};
int i,j,N,M,Si,Sj,Fi,Fj,nrD;
int Dri[maxn*maxn],Drj[maxn*maxn];
int A[maxn][maxn],D[maxn][maxn],T[maxn][maxn];
queue<int> Qi,Qj;

void citire()
{
	char x;
	scanf("%d %d\n",&N,&M);
	for(i=1;i<=N;i++)
	{
		for(j=1;j<=M;j++)
		{
			scanf("%c",&x);
			if(x=='*') A[i][j]=1;
			if(x=='I') { Si=i; Sj=j; }
			if(x=='O') { Fi=i; Fj=j; }
			if(x=='D') { Dri[++nrD]=i; Drj[nrD]=j; }
		}
		scanf("%c",&x);
	}
}

inline int min(int a, int b)
{
	return a<b ? a : b;
}

void dragoni()
{
	int d;
	for(i=1;i<=N;i++)
		for(j=1;j<=M;j++)
			D[i][j]=oo;
	for(i=1;i<=nrD;i++)
	{
		D[Dri[i]][Drj[i]]=0;
		Qi.push(Dri[i]);
		Qj.push(Drj[i]);
	}
	for(;!Qi.empty();Qi.pop(),Qj.pop())
	{
		i=Qi.front(); j=Qj.front();
		for(d=0;d<4;d++)
			if(i+dx[d]>0 && i+dx[d]<=N && j+dy[d]>0 && j+dy[d]<=M)
			if(D[i][j]+1<D[i+dx[d]][j+dy[d]])
			{
				D[i+dx[d]][j+dy[d]]=D[i][j]+1;
				Qi.push(i+dx[d]);
				Qj.push(j+dy[d]);
			}
	}
}

void drum()
{
	int d;
	for(i=1;i<=N;i++)
		for(j=1;j<=M;j++)
			T[i][j]=-1;
	T[Si][Sj]=D[Si][Sj];
	Qi.push(Si); Qj.push(Sj);
	for(;!Qi.empty();Qi.pop(),Qj.pop())
	{
		i=Qi.front(); j=Qj.front();
		for(d=0;d<4;d++)
			if(i+dx[d]>0 && i+dx[d]<=N && j+dy[d]>0 && j+dy[d]<=M)
			if(A[i+dx[d]][j+dy[d]]==0 && min(T[i][j],D[i+dx[d]][j+dy[d]])>T[i+dx[d]][j+dy[d]])
			{
				T[i+dx[d]][j+dy[d]]=min(T[i][j],D[i+dx[d]][j+dy[d]]);
				Qi.push(i+dx[d]); Qj.push(j+dy[d]);
			}
	}
}

int main()
{
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	citire();
	dragoni();
	drum();
	printf("%d",T[Fi][Fj]);
}