Pagini recente » Cod sursa (job #3227204) | Cod sursa (job #805149) | Cod sursa (job #886665) | Cod sursa (job #3138389) | Cod sursa (job #2144293)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
queue <int> C1,C2;
int a[1005][1005],n,m,li,ci,lf,cf,maxi,d[1005][1005];
char x;
int main()
{
int i,j,l,c,lv,cv;
int ok,mij,st,dr;
int dl[4]={-1,0,1,0};
int dc[4]={0,1,0,-1};
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
d[i][j]=999999;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
fin>>x;
if(x=='I')
{
li=i;
ci=j;
a[i][j]=1;
}
else
if(x=='O')
{
lf=i;
cf=j;
a[i][j]=1;
}
else
if(x=='D'||x=='*')
{a[i][j]=-1;
if(x=='D')
{
C1.push(i);
C2.push(j);
d[i][j]=0;
}
}
else
a[i][j]=1;
}
for (i=0;i<=n+1;++i)
a[i][0]=a[i][m+1]=d[i][0]=d[i][m+1]=-1;
for (j=0;j<=m+1;++j)
a[0][j]=a[n+1][j]=d[0][j]=d[n+1][j]=-1;
while(!C1.empty())
{
l=C1.front();
C1.pop();
c=C2.front();
C2.pop();
for(i=0;i<4;i++)
{
lv=l+dl[i];
cv=c+dc[i];
if(a[lv][cv]!=-1&&d[l][c]+1<d[lv][cv])
{
d[lv][cv]=d[l][c]+1;
C1.push(lv);
C2.push(cv);
}
}
}
ok=1;
st=1;
dr=min(n,m);
while(st<=dr)
{
mij=(st+dr)/2;
if(d[li][ci]>=mij)
{
C1.push(li);
C2.push(ci);
a[li][ci]=2;
ok=0;
while(!C1.empty())
{
l=C1.front();
C1.pop();
c=C2.front();
C2.pop();
for(i=0;i<4;i++)
{
lv=l+dl[i];
cv=c+dc[i];
if(a[lv][cv]==1&&d[lv][cv]>=mij)
{
a[lv][cv]=2;
if(lv==lf&&cv==cf)
{ ok=1;
maxi=max(maxi,mij);
}
else
{
C1.push(lv);
C2.push(cv);
}
}
}
}
if(ok==0)
dr=mij-1;
else
st=mij+1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]==2)
a[i][j]=1;
}
else
dr=mij-1;
}
if(maxi)
fout<<maxi;
else
fout<<-1;
return 0;
}