Pagini recente » Cod sursa (job #1413572) | Cod sursa (job #2358685) | Cod sursa (job #2127558) | Cod sursa (job #780560) | Cod sursa (job #3212386)
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
using namespace std;
char v[1005][1005];
int d[1005][1005], f[1005][1005];
queue<pair<int, int>>q;
int dirl[]={-1, 0, 1, 0};
int dirc[]={0, 1, 0, -1};
void dfs(int l, int c, int a)
{
int x, y;
f[l][c]=1;
for(int i=0; i<=3; i++)
{
x=l+dirl[i];y=c+dirc[i];
if(v[x][y]=='.' && f[x][y]==0 && d[x][y]>=a)
dfs(x, y, a);
}
}
int main()
{
ifstream cin("barbar.in");
ofstream cout("barbar.out");
int n, m, l, c, l2, c2, lin, col, x, y, st, dr, ans=-1, mij;
cin>>n>>m;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>v[i][j];
if(v[i][j]=='I')
{
l=i;
c=j;
v[i][j]='.';
}
else if(v[i][j]=='O')
{
l2=i;
c2=j;
v[i][j]='.';
}
else if(v[i][j]=='D')
{
v[i][j]='.';
q.push({i, j});
}
}
}
while(!q.empty())
{
pair<int, int>crn=q.front();
lin=crn.first;col=crn.second;
q.pop();
for(int i=0; i<=3; i++)
{
x=lin+dirl[i];y=col+dirc[i];
if(v[x][y]=='.' && d[x][y]==0)
{
d[x][y]=d[lin][col]+1;
q.push({x, y});
}
}
}
st=0;dr=1e9;
while(st<=dr)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
f[i][j]=0;
}
mij=(st+dr)/2;
dfs(l, c, mij);
if(f[l2][c2]==1)
{
ans=mij;
st=mij+1;
}
else
dr=mij-1;
}
cout<<ans;
return 0;
}