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