Pagini recente » Cod sursa (job #2611499) | Cod sursa (job #3249134) | Cod sursa (job #78251) | Cod sursa (job #2533138) | Cod sursa (job #327676)
Cod sursa(job #327676)
#include<stdio.h>
#include<fstream>
using namespace std;
int a[1001][1001],b[1001][1001],l,c,li,ci,lf,cf;
struct coada{int l,c;}v[1000001];
int dl[]={0,0,1,0,-1},k,dc[]={0,1,0,-1,0};
void citire(){
ifstream f("barbar.in");
int i,j;
char x;
f>>l>>c;
for(i=1;i<=l;i++)
for(j=1;j<=c;j++)
{f>>x;
if(x=='D')
{k++;v[k].l=i;v[k].c=j;b[i][j]=1;a[i][j]=1;}
else
if(x=='*')
b[i][j]=-1;
else
if(x=='I'){
li= i;ci=j;
}
else
if(x=='O'){
lf=i;cf=j;
}
}
}
void fill(){
int i,p,L,C,q;
p=1;q=k;
while(p<=q){
for(i=1;i<=4;i++)
{L=dl[i]+v[p].l;
C=dc[i]+v[p].c;
if((!a[L][C])&&(L>0)&&(C>0)&&(L<=l)&&(C<=c))
{a[L][C]=a[v[p].l][v[p].c]+1;
q++;v[q].l=L;v[q].c=C;b[L][C]=1;
}
}
p++;
}}
int test(int val,int nr){
int i,p,q,L,C;
p=1;q=1;
if((a[v[1].l][v[1].c]-1)<val) return 0;
while(p<=q){
for(i=1;i<=4;i++)
{L=v[p].l+dl[i];
C=v[p].c+dc[i];
if(((a[L][C]-1)>=val)&&(b[L][C]!=-1)&&(b[L][C]!=nr)&&(L>0)&&(C>0)&&(L<=l)&&(C<=c))
{q++;b[L][C]=nr;
v[q].l=L;v[q].c=C;
if((L==lf)&&(C=cf))return 1;
}
}
p++;
}
return 0;
}
void caut(){
int nr=2;
int p,u,m,sol=0;
p=0;u=l;v[1].l=li;v[1].c=ci;
while(p<=u){
m = (p+u)>>1;
if(test(m,nr)){p=m+1;sol=m;}
else
u=m-1;
nr++;}
freopen("barbar.out","w",stdout);
if(sol)
printf("%d",sol);
else
printf("%d",-1);
}
int main(){
citire();
fill();
caut();
return 0;
}