Pagini recente » Cod sursa (job #2331403) | Cod sursa (job #1634610) | Cod sursa (job #3004522) | Cod sursa (job #349471) | Cod sursa (job #2958789)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, a[1001][1001], x, y, x2, y2, st=1, dr, viz[1001][1001];
char ch;
int di[4]={1, -1, 0, 0};
int dj[4]={0, 0, 1, -1};
struct coada
{
int x;
int y;
}q[1000001];
int main()
{
fin>>n>>m;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
fin>>ch;
if(ch=='.')
{
a[i][j]=0;
}
else if(ch=='*')
{
a[i][j]=-1;
}
else if(ch=='D')
{
q[++dr]={i, j};
a[i][j]=1;
}
else if(ch=='I')
{
x=i;
y=j;
}
else if(ch=='O')
{
x2=i;
y2=j;
}
}
}
while(st<=dr)
{
int i=q[st].x;
int j=q[dr].y;
st++;
for(int d=0; d<4; d++)
{
int ii = i + di[d];
int jj = j + dj[d];
if (ii>=1 && jj>=1 && ii <= n && jj <= m && a[ii][jj] == 0)
{
q[++dr]={ii, jj};
a[ii][jj]=a[i][j]+1;
}
}
}
int sol=-1;
int p=1;
int u=n*m;
while(p<=u)
{
int mid=(p+u)/2;
if(a[x][y]<mid)
{
u=mid-1;
continue;
}
memset(viz, 0, sizeof(viz));
st=dr=1;
q[1]={x, y};
viz[x][y]=1;
while(st<=dr)
{
int i=q[st].x;
int j=q[st].y;
st++;
for(int d=0; d<4; d++)
{
int ii=i+di[d];
int jj=j+dj[d];
if(ii>=1 && jj>=1 && ii<=n && jj<+m && viz[ii][jj]==0)
{
viz[ii][jj]=1;
}
}
}
if(viz[x2][y2]==1)
{
p=mid+1;
sol=mid-1;
}
else
{
u=mid-1;
}
}
fout<<sol;
return 0;
}