Pagini recente » Cod sursa (job #1182071) | Cod sursa (job #1588135) | Cod sursa (job #2944573) | Cod sursa (job #963323) | Cod sursa (job #3242551)
#include <bits/stdc++.h>
///#define int long long
using namespace std;
#define cin in
#define cout out
ifstream in ("barbar.in");
ofstream out ("barbar.out");
#define f first
#define s second
#define inf 100000008
int n, m, sx, sy, fx, fy;
const int maxN=1008;
int grid[maxN][maxN];
vector <pair <int, int>> dragoni;
int dist[maxN][maxN];
int dx[]={0, 0, -1, 1};
int dy[]={-1, 1, 0, 0};
bool check(int x, int y)
{
return (x>=1 && y>=1 && x<=n && y<=m && grid[x][y]==0);
}
void bfs()
{
queue <pair <int, int>> q;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++) dist[i][j]=inf;
for (auto x:dragoni) {q.push(x); dist[x.f][x.s]=0;}
while (!q.empty())
{
int x=q.front().first;
int y=q.front().second;
q.pop();
for (int i=0; i<4; i++)
{
int nx=x+dx[i]; int ny=y+dy[i];
if (!check(nx, ny) || dist[nx][ny]<=dist[x][y]+1) continue;
dist[nx][ny]=dist[x][y]+1;
q.push({nx, ny});
}
}
}
bool vis[maxN][maxN];
int aux;
void dfs(int x, int y)
{
vis[x][y]=true;
for (int i=0; i<4; i++)
{
int nx=x+dx[i]; int ny=y+dy[i];
if (!check(nx, ny) || dist[nx][ny]<aux || vis[nx][ny]) continue;
dfs(nx, ny);
}
}
signed main()
{
cin>>n>>m;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
{
char c; cin>>c;
if (c=='.' || c=='I' || c=='O') grid[i][j]=0;
if (c=='*' || c=='D') grid[i][j]=1;
if (c=='D') dragoni.push_back({i, j});
if (c=='I') {sx=i; sy=j;}
if (c=='O') {fx=i; fy=j;}
}
bfs();
int le=0, ri=inf;
while (le<ri)
{
int mid=le+(ri-le+1)/2;
aux=mid;
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
vis[i][j]=false;
if (dist[sx][sy]>=aux) dfs(sx, sy);
if (vis[fx][fy]) le=mid;
else ri=mid-1;
}
cout<<(le==0 ? -1 : le);
return 0;
}