Pagini recente » Cod sursa (job #1761113) | Cod sursa (job #2817069) | Cod sursa (job #1291488) | Cod sursa (job #1322210) | Cod sursa (job #3242569)
#include <bits/stdc++.h>
using namespace std;
#define int long long
int dis[1001][1001];
char mat[1001][1001];
int ans[1001][1001];
int diri[4] = {1,0,-1,0};
int dirj[4] = {0,-1,0,1};
vector<pair<int,int>>x;
int n,m;
void LEED()
{
queue<pair<int,int>>q;
for(int i=0; i<x.size(); i++)
{
q.push({x[i]});
dis[x[i].first][x[i].second]=1;
}
while(!q.empty())
{
int a = q.front().first;
int b = q.front().second;
q.pop();
for(int i=0;i<=3;i++)
{
int a1 = a+diri[i];
int b1 = b+dirj[i];
if(a1<=n && a1>=1 && b1<=m && b1>=1)
{
if(!dis[a1][b1] || dis[a1][b1] > dis[a][b]+1)
{
dis[a1][b1] = dis[a][b] + 1;
q.push({a1,b1});
}
}
}
}
}
int fin1,fin2;
int st1,st2;
int LEE2()
{
int l=0;
int r=2e9;
int inr = r;
while(l<r-1)
{
int mid=(l+r)/2;
cout<<mid<<'\n';
queue<pair<int,int>>q;
if(dis[st1][st2] > mid)
q.push({st1,st2});
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
ans[i][j] = 0;
// cout<<dis[i][j]<<" ";
}
//cout<<'\n';
}
ans[st1][st2]=1;
while(!q.empty())
{
int a = q.front().first;
int b = q.front().second;
q.pop();
for(int i=0;i<=3;i++)
{
int a1 = a+diri[i];
int b1 = b+dirj[i];
if(a1<=n && a1>=1 && b1<=m && b1>=1 && dis[a1][b1] > mid)
{
if(!ans[a1][b1] || ans[a1][b1] > ans[a][b]+1)
{
ans[a1][b1] = ans[a][b] + 1;
q.push({a1,b1});
}
}
}
}
if(ans[fin1][fin2] == 0)
{
l=mid;
}
else
{
r=mid;
}
}
if(r==inr)
{
return -1;
}
return r-1;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>mat[i][j];
if(mat[i][j] == 'D')
x.push_back({i,j});
if(mat[i][j] == '*')
dis[i][j] = -1;
if(mat[i][j] == 'O')
{
fin1=i;
fin2=j;
}
if(mat[i][j] == 'I')
{
st1=i;
st2=j;
}
}
}
LEED();
cout<<LEE2();
return 0;
}