Pagini recente » Cod sursa (job #1613614) | Cod sursa (job #1379938) | Cod sursa (job #467056) | Cod sursa (job #2684900) | Cod sursa (job #2004207)
#include <fstream>
using namespace std;
int dmaxloc;
char di[] = {1, 0, -1, 0};
char dj[] = {0, 1, 0, -1};
char d, ok=0, okg=0;
int dmax=1;
short int v[1001][1001];
short int c[2][1000*1000 + 1];
short int istart, jstart, ifinal, jfinal, i, j, n, nr, a[1001][1001], b, ic, jc, iv, jv, p, u, sol, m, ii, jj, maxim, st, dr, mid;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int main(){
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
fin>>d;
if(d=='D'){
v[i][j] = -1;
c[0][++u]=i;
c[1][u]=j;
}
if(d=='*')
v[i][j] = -2;
if(d=='I'){
istart=i;
jstart=j;
}
if(d=='O'){
ifinal=i;
jfinal=j;
}
}
p=u=1;
while(p<=u){ // aflu distanta pana la cel mai apropiat dragon
ic=c[0][p]; // pentru fiecare celula
jc=c[1][p];
for(i=0;i<=3;i++){
iv=ic+di[i];
jv=jc+dj[i];
if(iv>=1 && iv<=n && jv>=1 && jv<=m && v[iv][jv]==0){
v[iv][jv]=v[ic][jc]+1;
u++;
c[0][u]=iv;
c[1][u]=jv;
}
}
p++;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
v[i][j]++;
c[0][1]=istart;
c[1][1]=jstart;
st=0;
dr=v[istart][jstart];
while(st<=dr){
mid=(st+dr)/2;
p=u=1;
ok=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
a[i][j]=0;
a[istart][jstart]=1;
while(p<=u){
ic=c[0][p];
jc=c[1][p];
for(i=0;i<=3;i++){
iv=ic+di[i];
jv=jc+dj[i];
if(iv>=1 && iv<=n && jv>=1 && jv<=m && v[iv][jv]>=mid && a[iv][jv]==0){
u++;
c[0][u]=iv;
c[1][u]=jv;
a[iv][jv]=a[ic][jc]+1;
if(iv == ifinal && jv == jfinal){ // daca am putut ajunge la iesirea din temnita cu mid
if(mid>sol){
sol=mid;
// nr=a[iv][jv];
}
ok=1;
okg=1; // se poate iesi din temnita
p=u+1; // avem cel putin o cale de iesire din temnita cu mid, asa ca nu mai incercam alte drumuri
break;
}
}
}
p++;
}
if(ok==1)
st=mid+1;
else
dr=mid-1;
}
if(okg==1)
fout<<sol;
else
fout<<"-1";
//fout<<nr;
return 0;
}