Pagini recente » Cod sursa (job #2224905) | Cod sursa (job #1675653) | Cod sursa (job #239911) | Cod sursa (job #1692966) | Cod sursa (job #1000428)
#include<stdio.h>
#include<algorithm>
#include<queue>
#define mp make_pair
#define x first
#define y second
#define maxn 1005
using namespace std;
int n,m,maxx;
int used[maxn][maxn];
int d[maxn][maxn],dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
char s[maxn],a[maxn][maxn];
queue < pair<int,int> > q;
pair<int,int> inp,outp;
void read()
{
scanf("%d%d\n",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s\n",s+1);
for(int j=1;j<=m;j++)
{
a[i][j]=s[j];
if(s[j]=='I') {inp=mp(i,j);continue;}
if(s[j]=='O') {outp=mp(i,j);continue;}
if(s[j]=='.') continue;
if(s[j]=='D') q.push(mp(i,j));
}
}
}
void bfs()
{
int i,j,newi,newj;
for(;!q.empty();q.pop())
{
i=q.front().x; j=q.front().y;
for(int k=0;k<4;k++)
{
newi=i+dx[k]; newj=j+dy[k];
if(newi<1 || newj<1 || newi>n || newj>m) continue;
if(a[newi][newj]=='*' || a[newi][newj]=='D' || d[newi][newj]) continue;
q.push(mp(newi,newj)); d[newi][newj]=d[i][j]+1; maxx=max(maxx,d[newi][newj]);
}
}
}
int search(int val)
{
int i,j,newi,newj;;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
used[i][j]=0;
if(d[inp.x][inp.y]<val) return 0;
while(!q.empty()) q.pop();
for(q.push(inp),used[inp.x][inp.y]=1;!q.empty();q.pop())
{
i=q.front().x; j=q.front().y;
for(int k=0;k<4;k++)
{
newi=i+dx[k]; newj=j+dy[k];
if(newi<1 || newj<1 || newi>n || newj>m) continue;
if(a[newi][newj]=='*' || used[newi][newj] || d[newi][newj]<val) continue;
q.push(mp(newi,newj)); used[newi][newj]=1;
if(newi==outp.x && newj==outp.y) return 1;
}
}
return 0;
}
void solve()
{
int i,step;
maxx++;
for(step=1;step<maxx;step<<=1);
for(i=-1;step;step>>=1)
if(i+step<=maxx && search(i+step))
i+=step;
printf("%d",i);
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
read();
bfs();
solve();
fclose(stdin);
fclose(stdout);
}