Pagini recente » Cod sursa (job #351598) | Cod sursa (job #2089764) | Cod sursa (job #3314043) | Cod sursa (job #296280) | Cod sursa (job #3319261)
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int n, m;
int sx, sy, ex, ey;
int dist[4005][4005];
bool wall[4005][4005];
vector<pair<int,int>> dragoni;
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,-1,1};
bool inside(int x,int y){ return x>=1 && x<=n && y>=1 && y<=m; }
bool can(int k) {
vector<vector<int>> vis(n+1, vector<int>(m+1, 0));
queue<pair<int,int>> q;
if (dist[sx][sy] < k) return false;
q.push({sx, sy});
vis[sx][sy] = 1;
while (!q.empty()) {
auto [x,y]=q.front(); q.pop();
if (x==ex && y==ey) return true;
for (int d=0; d<4; d++) {
int nx=x+dx[d], ny=y+dy[d];
if (inside(nx,ny) && !wall[nx][ny] && !vis[nx][ny] && dist[nx][ny]>=k) {
vis[nx][ny]=1;
q.push({nx,ny});
}
}
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) {
char c; cin>>c;
if(c=='*') wall[i][j]=1;
else if(c=='D') dragoni.push_back({i,j});
else if(c=='I') sx=i,sy=j;
else if(c=='O') ex=i,ey=j;
dist[i][j]=INF;
}
// BFS de la dragoni
queue<pair<int,int>> q;
for(auto [x,y]:dragoni){ dist[x][y]=0; q.push({x,y}); }
while(!q.empty()){
auto [x,y]=q.front(); q.pop();
for(int d=0;d<4;d++){
int nx=x+dx[d], ny=y+dy[d];
if(inside(nx,ny) && !wall[nx][ny] && dist[nx][ny]==INF){
dist[nx][ny]=dist[x][y]+1;
q.push({nx,ny});
}
}
}
int st=0, dr=n+m, ans=-1;
while(st<=dr){
int mid=(st+dr)/2;
if(can(mid)){ ans=mid; st=mid+1; }
else dr=mid-1;
}
cout<<ans;
}