Pagini recente » Cod sursa (job #1678069) | Cod sursa (job #1032790) | Cod sursa (job #2445010) | Cod sursa (job #1523519) | Cod sursa (job #1930144)
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,m,i,j,nr,q,w,step,x,y,X,Y,D[1<<10][1<<10],viz[1<<10][1<<10];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
bool OK[1<<10][1<<10];
char M[1<<10][1<<10];
queue <pair <int,int> > Q;
bool check(int dist)
{
++nr;
if(D[x][y]>=dist) Q.push(make_pair(x,y));
while(!Q.empty())
{
q=Q.front().first;
w=Q.front().second;
Q.pop();
if(viz[q][w]==nr) continue;
viz[q][w]=nr;
for(i=0;i<4;++i)
{
int l=q+dx[i];
int c=w+dy[i];
if(!OK[l][c]&&D[l][c]>=dist)
Q.push(make_pair(l,c));
}
}
return (viz[X][Y]==nr);
}
int main()
{
f>>n>>m;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j) D[i][j]=1<<30;
for(i=1;i<=n;++i)
{
f>>(M[i]+1);
for(j=1;j<=m;++j)
{
if(M[i][j]=='I') x=i,y=j;
if(M[i][j]=='O') X=i,Y=j;
if(M[i][j]=='D')
{
Q.push(make_pair(i,j));
D[i][j]=0;
}
}
}
for(i=0;i<=n+1;++i)
for(j=0;j<=m+1;++j)
if(!i||!j||i==n+1||j==m+1||M[i][j]=='*') OK[i][j]=1;
++nr;
while(!Q.empty())
{
q=Q.front().first;
w=Q.front().second;
Q.pop();
if(viz[q][w]==nr) continue;
viz[q][w]=nr;
for(i=0;i<4;++i)
{
int l=q+dx[i];
int c=w+dy[i];
if(!OK[l][c]&&D[l][c]>D[q][w]+1)
{
D[l][c]=D[q][w]+1;
Q.push(make_pair(l,c));
}
}
}
++nr;
Q.push(make_pair(x,y));
while(!Q.empty())
{
q=Q.front().first;
w=Q.front().second;
Q.pop();
if(viz[q][w]==nr) continue;
viz[q][w]=nr;
for(i=0;i<4;++i)
if(!OK[q+dx[i]][w+dy[i]]&&M[q+dx[i]][w+dy[i]]!='D')
Q.push(make_pair(q+dx[i],w+dy[i]));
}
if(viz[X][Y]!=nr)
{
g<<-1;
return 0;
}
int sol=0;
for(step=1<<9;step;step>>=1)
if(sol+step<=min(n,m))
if(check(sol+step)) sol+=step;
g<<sol;
return 0;
}