Pagini recente » Cod sursa (job #1310405) | Cod sursa (job #2275208) | Cod sursa (job #2960226) | Cod sursa (job #2744551) | Cod sursa (job #2051595)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int p,u,q[2][1000001],v[1002][1002],a[1002][1002],i,j,l1,c1,l2,c2,n,m,x,sol,st,dr,dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
char t;
bool viz[1001][1001];
void dragon()
{
while(p<=u)
{
int i;
int l=q[0][p];
int c=q[1][p];
for(i=0;i<=3;i++)
{
int lx=l+dx[i];
int cy=c+dy[i];
if(v[lx][cy]==0&&a[lx][cy]==1)
{
u++;
q[0][u]=lx;
q[1][u]=cy;
v[lx][cy]=v[l][c]+1;
}
}
p++;
}
}
int coada(int x)
{
int p=1;
int u=1;
int i;
if(v[l1][c1]<x)
return 0;
q[0][1]=l1;
q[1][1]=c1;
memset(viz,0,sizeof(viz));
viz[l1][c1]=1;
while(p<=u&&viz[l2][c2]==0)
{
int l=q[0][p];
int c=q[1][p];
for(i=0;i<=3;i++)
{
int lx=l+dx[i];
int cy=c+dy[i];
if(v[lx][cy]>=x&&viz[lx][cy]==0&&a[lx][cy]==1)
{
u++;
q[0][u]=lx;
q[1][u]=cy;
viz[lx][cy]=1;
}
}
p++;
}
if(viz[l2][c2]==1)
return 1;
return 0;
}
int main()
{
f>>n>>m;
for(i=0;i<=n+1;i++)
{
v[i][0]=-1;
v[i][m+1]=-1;
}
for(j=0;j<=m+1;j++)
{
v[0][j]=-1;
v[n+1][j]=-1;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
f>>t;
if(t=='D')
{
u++;
q[0][u]=1;
q[1][u]=1;
}
else
if(t=='I')
{
l1=i;
c1=j;
a[i][j]=1;
}
else
if(t=='*')
v[i][j]=-1;
else
if(t=='O')
{
l2=i;
c2=j;
a[i][j]=1;
}
else
a[i][j]=1;
}
p=1;
dragon();
st=0;
dr=max(n,m);
sol=-1;
while(st<=dr)
{
x=(st+dr)/2;
if(coada(x)==1)
{
sol=x;
st=x+1;
}
else
{
dr=x-1;
}
}
g<<sol;
return 0;
}