Pagini recente » Cod sursa (job #205259) | Cod sursa (job #816049) | Cod sursa (job #1649714) | Cod sursa (job #943590) | Cod sursa (job #2760366)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1003;
int n,m,a,b,ox,oy;
int v[NMAX][NMAX];
int viz[NMAX][NMAX];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
queue<pair<int,int> >q;
bool inside(int x,int y){
return x>=1 && y>=1 && x<=n && y<=m;
}
bool ok(int val){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)viz[i][j]=0;
}
queue<pair<int,int> >q;
q.push({a,b});
while(!q.empty()){
int x=q.front().first;
int y=q.front().second;
q.pop();
for(int i=0;i<4;i++){
int newx=x+dx[i];
int newy=y+dy[i];
if(inside(newx,newy)){
if(v[newx][newy] > -1 && v[newx][newy]>=val && !viz[newx][newy] ){
q.push({newx,newy});
viz[newx][newy]=1;
}
}
}
}
if(viz[ox][oy])return 1;
return 0;
}
int main(){
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
v[i][j]=INT_MAX;
char c;
cin>>c;
if(c=='D'){
v[i][j]=0;
q.push({i,j});
}else if(c=='I'){
a=i;
b=j;
}else if(c=='*'){
v[i][j]=-1;
}else if(c=='O'){
ox=i;
oy=j;
}
}
}
while(!q.empty()){
int x = q.front().first;
int y = q.front().second;
q.pop();
for(int i=0;i<4;i++){
int newx=x+dx[i];
int newy=y+dy[i];
if(inside(newx,newy)){
if(v[newx][newy]>-1 && v[x][y]+1<v[newx][newy] ){
v[newx][newy]=v[x][y]+1;
q.push({newx,newy});
}
}
}
}
int st=0,dr=v[a][b],last=-1;
while(dr-st>=0){
int mid=(st+dr)>>1;
if(ok(mid) ){
last=mid;
st=mid+1;
}else{
dr=mid-1;
}
}
printf("%d\n",last);
return 0;
}