Pagini recente » Cod sursa (job #819430) | Cod sursa (job #565829) | Cod sursa (job #2411435) | Cod sursa (job #1420320) | Cod sursa (job #2358568)
#include <fstream>
#include <iostream>
#include <bitset>
#define dim 1001
#define x first
#define y second
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,i,j,d[dim][dim],is,js,it,jt,st,dr,mid;
char s;
pair<int,int> c[dim*dim];
int p,u;
bool a[dim][dim];
bool v[dim][dim];
int D;
int di[]={-1,0,0,1};
int dj[]={0,-1,1,0};
int ic,jc,iv,jv;
int main(){
fin>>n>>m;
p=1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
fin>>s;
if(s=='I')
is=i,js=j;
if(s=='D'){
a[i][j]=1;
c[++u]=make_pair(i,j);
d[i][j]=1;
}
if(s=='*')
a[i][j]=1;
if(s=='O')
it=i,jt=j;
}
while(p<=u){
ic=c[p].x; jc=c[p].y;
for(D=0;D<4;D++){
iv=i+di[D]; jv=j+dj[D];
if(iv>0 && jv>0 && iv<=n && jv<=m){
if(!d[iv][jv]){
d[iv][jv]=d[ic][jc]+1;
c[++u]=make_pair(iv,jv);
}
}
}
p++;
}
st=1; dr=n*m+1;
while(st<=dr && !v[it][jt]){
mid=st+(dr-st)/2;
p=1; u=1;
c[u]=make_pair(is,js);
v[is][js]=1;
while(p<=u){
ic=c[p].x; jc=c[p].y;
for(D=0;D<4;D++){
iv=i+di[D]; jv=j+dj[D];
if(iv>0 && jv>0 && iv<=n && jv<=m){
if(d[iv][jv]>=mid && !v[iv][jv]){
v[iv][jv]=1;
c[++u]=make_pair(iv,jv);
}
}
}
p++;
}
if(v[it][jt])
st=mid+1;
else
dr=mid-1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
v[i][j]=0;
}
fout<<dr;
return 0;
}