Pagini recente » Cod sursa (job #757950) | Cod sursa (job #1780116) | Cod sursa (job #1544324) | Cod sursa (job #1571144) | Cod sursa (job #1090489)
#include <fstream>
#include<string.h>
#define INF 2000000000
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,i,j,a[1001][1001],b[1001][1001],q[2][1001*1001],m,p,u,dx[4]={-1,0,0,1},dy[4]={0,1,-1,0},sol,ok,viz[1001][1001],x1,y1,x2,y2;
char ch;
int lee(int k){
int p,u,l,c,i;
p=u=1;
if(b[x1][y1]<k)
return 0;
memset(viz,0,sizeof(viz));
viz[x1][y1]=1;
q[0][p]=x1;
q[1][p]=y1;
while(p<=u&&viz[x2][y2]==0){
for(i=0;i<4;i++)
{
l=q[0][p]+dx[i];
c=q[1][p]+dy[i];
if(a[l][c]==1 && b[l][c]>=k && viz[l][c]==0)
{
viz[l][c]=1;
q[0][++u]=l;
q[1][u]=c;
if(l==x2&&c==y2)
return 1;
}
}
p++;
}
return 0;
}
int main()
{
f>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
b[i][j]=INF;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
f>>ch;
if(ch=='.')
a[i][j]=1;
else
if(ch=='D'){
b[i][j]=0;a[i][j]=1;
q[0][++u]=i;
q[1][u]=j;}
else
if(ch=='I'){
a[i][j]=1;
x1=i;
y1=j;}
else
if(ch=='O'){
a[i][j]=1;
x2=i;
y2=j;}
}
p=1;
while(p<=u){
int l=q[0][p];
int c=q[1][p];
for(i=0;i<=3;i++)
if(a[l+dx[i]][c+dy[i]]!=0 && b[l][c]+1<b[l+dx[i]][c+dy[i]]){
q[0][++u]=l+dx[i];
q[1][u]=c+dy[i];
b[l+dx[i]][c+dy[i]]=b[l][c]+1;
}
p++;
}
int st=0;
int dr=n*m;
sol=-1;
while(st<=dr){
int mij=(st+dr)/2;
ok=lee(mij);
if(ok==1){
sol=mij;
st=mij+1;
}
else
dr=mij-1;
}
g<<sol;
return 0;
}