Pagini recente » Cod sursa (job #692512) | Cod sursa (job #2041283) | Cod sursa (job #1514986) | Cod sursa (job #2041053) | Cod sursa (job #1936245)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
char m[1002][1002];
int r,c,va[1005][1005],v[1005][1005],da[]={-1,0,1,0},db[]={0,1,0,-1},maxo;
typedef pair<int, int> pij;
queue <pij> qu;
pij st,fi;
void lee(){
while(!qu.empty()){
int a=qu.front().first;
int b=qu.front().second;
qu.pop();
for(int k=0;k<=3;++k){
int nxa=a+da[k];
int nxb=b+db[k];
if(nxa<1 || nxb<1 || nxa>r || nxb>c)continue;
if(m[nxa][nxb]=='D' || m[nxa][nxb]=='*')continue;
if(v[nxa][nxb])continue;
v[nxa][nxb]=v[a][b]+1;
qu.push({nxa,nxb});
}
}
}
void lee1(int w){
for(int i=1;i<=r;++i)
for(int j=1;j<=c;++j)
va[i][j]=0;
if(v[st.first][st.second]>=w){
qu.push(st);
va[st.first][st.second]=1;
}
while(!qu.empty()){
int a=qu.front().first;
int b=qu.front().second;
qu.pop();
for(int k=0;k<=3;++k){
int nxa=a+da[k];
int nxb=b+db[k];
if(nxa<1 || nxb<1 || nxa>r || nxb>c)continue;
if(m[nxa][nxb]=='D' || m[nxa][nxb]=='*')continue;
if(v[nxa][nxb]<w)continue;
if(va[nxa][nxb])continue;
va[nxa][nxb]=1;
qu.push({nxa,nxb});
}
}
}
int main()
{
fin>>r>>c;
for(int i=1;i<=r;++i){
for(int j=1;j<=c;++j){
fin>>m[i][j];
if(m[i][j]=='D')
qu.push({i,j});
if(m[i][j]=='I')
st={i,j};
if(m[i][j]=='O')
fi={i,j};
}
}
lee();
int p=1,q=0,m;
for(int i=1;i<=r;++i)
for(int j=1;j<=c;++j)
q=max(q,v[i][j]);
while(p<=q){
m=(p+q)/2;
lee1(m);
if(va[fi.first][fi.second]){
maxo=m;
p=m+1;
}
else
q=m-1;
}
fout<<(maxo?maxo:-1)<<'\n';
return 0;
}