Pagini recente » Cod sursa (job #1741502) | Cod sursa (job #1369002) | Cod sursa (job #2892853) | Cod sursa (job #2893037) | Cod sursa (job #2623935)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int nd=4;
const int dx[nd]={1,-1,0,0}, dy[nd]={0,0,1,-1};
const int nmax=1000,mmax=1000;
int d[nmax+2][mmax+2];
int v[nmax+2][mmax+2];
struct str{
int x,y;
};
queue <str> q;
str start,finish;
int n,m;
bool bfs(int k){
if(d[start.x][start.y]<k){
return 0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
v[i][j]=0;
}
}
v[start.x][start.y]=1;
q.push(start);
while(q.empty()==0){
int x=q.front().x, y=q.front().y;
q.pop();
for(int i=0;i<nd;++i){
int xn=x+dx[i], yn=y+dy[i];
if(d[xn][yn]>=k&&v[xn][yn]==0){
v[xn][yn]=1;
str aux;
aux.x=xn;
aux.y=yn;
q.push(aux);
}
}
}
return v[finish.x][finish.y]!=0;
}
int main(){
fin>>n>>m;
for(int i=0;i<=n+1;i++){
d[i][0]=-1;
d[i][m+1]=-1;
}
for(int j=1;j<=m;j++){
d[0][j]=-1;
d[n+1][j]=-1;
}
for(int i=1;i<=n;++i){
string z;
fin>>z;
for(int j=1;j<=m;j++){
if(z[j-1]=='*'){
d[i][j]=-1;
}else if(z[j-1]=='D'){
d[i][j]=1;
str aux;
aux.x=i;
aux.y=j;
q.push(aux);
}else if(z[j-1]=='I'){
start.x=i;
start.y=j;
}else if(z[j-1]=='O'){
finish.x=i;
finish.y=j;
}
}
}
while(q.empty()==0){
int x=q.front().x, y=q.front().y;
q.pop();
for(int i=0;i<nd;++i){
int xn=x+dx[i], yn=y+dy[i];
if(d[xn][yn]==0){
d[xn][yn]=d[x][y]+1;
str aux;
aux.x=xn;
aux.y=yn;
q.push(aux);
}
}
}
int nm2=1;
while(nm2<=n*m){
nm2*=2;
}
nm2/=2;
int sol=0;
for(int i=nm2;i>0;i/=2){
if(sol+i<=n*m&&bfs(sol+i)==1){
sol+=i;
}
}
fout<<sol-1<<"\n";
return 0;
}