Pagini recente » Cod sursa (job #515112) | Cod sursa (job #2262803) | Cod sursa (job #986477) | Cod sursa (job #1007825) | Cod sursa (job #1211965)
#include <fstream>
#include <iostream>
using namespace std;
struct dragon{
int x,y;
};
int R,C,si,sj,ei,ej,l,r, a[1010][1010],aux[1010][1010]; char c; dragon d[1000*1000+10];
bool exista=false;
void propagate(int x, int y, int k){
if (k==0) return;
if (x>0 && x<=R && y>0 && y <=C && !aux[x][y]){
aux[x][y]=1;
propagate(x+1,y,k-1);
propagate(x-1,y,k-1);
propagate(x,y-1,k-1);
propagate(x,y+1,k-1);
}
}
void drum(int x, int y){
if (x==ei && y==ej) { exista=true; return; }
if (x>0 && x<=R && y>0 && y<=C && !aux[x][y]){
aux[x][y]=1;
drum(x+1,y);
drum(x-1,y);
drum(x,y+1);
drum(x,y-1);
}
}
int main(){
ifstream in("barbar.in");
ofstream out("barbar.out");
in>> R >> C;
int i,j,L=0;
for (i=1; i<=R; i++)
for (j=1; j<=C; j++){
in >> c;
if (c=='.') a[i][j]=0;
else if (c=='*') a[i][j]=1;
else if (c=='D') { L++; d[L].x=i; d[L].y=j; }
else if (c=='I') { si=i; sj=j;}
else { ei=i; ej=j; }
}
l=0;
r=10000;
int mid;
while ((r-l)>1) {
mid = (l+r)/2;
for (i=1; i<=R; i++)
for (j=1; j<=C; j++) aux[i][j]=a[i][j];
for (i=1; i<=L; i++) propagate(d[i].x, d[i].y, mid);
exista=false;
drum(si,sj);
if (exista) l=mid;
else r=mid-1;
}
for (i=1; i<=R; i++)
for (j=1; j<=C; j++) aux[i][j]=a[i][j];
for (i=1; i<=L; i++) propagate(d[i].x, d[i].y, r);
exista=false;
drum(si,sj);
if (exista) l =r;
for (i=1; i<=R; i++)
for (j=1; j<=C; j++) aux[i][j]=a[i][j];
exista=false;
drum(si,sj);
if (!exista) l=-1;
out << l;
return 0;
}