Pagini recente » Istoria paginii utilizator/ingridlibotean | Cod sursa (job #560471)
Cod sursa(job #560471)
#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]);
}