Pagini recente » Cod sursa (job #345069) | Cod sursa (job #2801095) | Cod sursa (job #1996798) | Cod sursa (job #2244012) | Cod sursa (job #3316558)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int di[]={0,0,1,-1};
const int dj[]={1,-1,0,0};
int n, m, mat[1005][1005], d[1005][1005], dd[1005][1005];
int is,js,ie,je;
queue<pair<int,int>> q;
int main()
{
fin>>n>>m;
for(int i=1; i<=n;i++)
for(int j=1; j<=m;j++)
dd[i][j]=1e9;
char x;
for(int i=1; i<=n;i++)
for(int j=1; j<=m; j++){
fin>>x;
if(x=='D'){
q.push({i,j});
dd[i][j]=0;
}
if(x=='I'){
is=i; js=j;
}
if(x=='O'){
ie=i; je=j;
}
if(x=='*')
mat[i][j]=1;
}
while(!q.empty()){
int x=q.front().first, y=q.front().second;
q.pop();
for(int k=0;k<4; k++){
int xv=x+di[k], yv=y+dj[k];
if(1<=xv && xv<=n && 1<=yv && yv<=m && !mat[xv][yv] && dd[x][y]+1<dd[xv][yv]){
dd[xv][yv]=dd[x][y]+1;
q.push({xv,yv});
}
}
}
int st=dd[is][js], dr=n+m;
while(st<=dr){
int mij=(st+dr)/2;
q.push({is,js});
for(int i=1; i<=n;i++)
for(int j=1; j<=m;j++)
d[i][j]=1e9;
d[is][js]=0;
while(!q.empty()){
int x=q.front().first, y=q.front().second;
q.pop();
for(int k=0;k<4; k++){
int xv=x+di[k], yv=y+dj[k];
if(1<=xv && xv<=n && 1<=yv && yv<=m && dd[xv][yv]>=mij &&!mat[xv][yv] && d[x][y]+1<d[xv][yv]){
d[xv][yv]=d[x][y]+1;
q.push({xv,yv});
}
}
}
if(d[ie][je]==1e9)
dr=mij-1;
else st=mij+1;
}
fout<<st-1;
return 0;
}