Pagini recente » Cod sursa (job #2985624) | Cod sursa (job #178260) | Cod sursa (job #2301434) | Cod sursa (job #686107) | Cod sursa (job #2299520)
#include <iostream>
#include <stdio.h>
using namespace std;
struct bar{int lin, col;};
int mat[1002][1002], matrice[1002][1002];
bar coada[2000002];
bar dir[4];
int main() {
FILE *fin, *fout;
int n, m, i, j, xlee, ylee, xin, yin, xsf, ysf, dragoni=0, front, back, l, c, dr, stg, mijl, steag, steagg=1;
int inf=2147483647;
char ch;
fin = fopen("barbar.in", "r");
fout = fopen("barbar.out", "w");
fscanf(fin,"%d%d", &n, &m);
fscanf(fin,"%c", &ch);
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
ch=getc(fin);
if(ch=='.')
mat[i][j]=inf;
if(ch=='*')
mat[i][j]=-1;
if(ch=='D'){
coada[++dragoni].lin=i;
coada[dragoni].col=j;
}
if(ch=='I'){
xin=i;
yin=j;
mat[i][j]=-2;
}
if(ch=='O'){
xsf=i;
ysf=j;
mat[i][j]=-3;
}
}
c=fgetc(fin);
}
for(i=0;i<=n+1;i++){
mat[i][0]=-1;
mat[i][m+1]=-1;
}
for(i=0;i<=m+1;i++){
mat[0][i]=-1;
mat[n+1][i]=-1;
}
front=1;
back=dragoni;
dir[0].lin=0;
dir[0].col=1;
dir[1].lin=1;
dir[1].col=0;
dir[2].lin=-1;
dir[2].col=0;
dir[3].lin=0;
dir[3].col=-1;
while(front<=back){
for(i=0;i<=3;i++){
l=coada[front].lin;
c=coada[front].col;
xlee=l+dir[i].lin;
ylee=c+dir[i].col;
if(mat[l][c]+1<mat[xlee][ylee]){
mat[xlee][ylee]=mat[l][c]+1;
coada[++back].lin=xlee;
coada[back].col=ylee;
}
}
front++;
}
for(i=1;i<=dragoni;i++){
mat[coada[i].lin][coada[i].col]=-1;;
}
stg=1;
dr=n+m+1;
mijl=(dr+stg)/2;
steagg=1;
while(stg<dr){
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
matrice[i][j]=0;
}
}
matrice[xin][yin]=1;
front=back=1;
steag=1;
coada[1].lin=xin;
coada[1].col=yin;
while(front<=back){
for(i=0;i<=3;i++){
l=coada[front].lin+dir[i].lin;
c=coada[front].col+dir[i].col;
if(mat[l][c]>=mijl&&mat[l][c]!=-1&&mat[l][c]!=-2&&matrice[l][c]==0){
coada[++back].lin=l;
coada[back].col=c;
matrice[l][c]=1;
}
if(mat[l][c]==-3)
steag=0;
}
front++;
}
if(steag==0){
if(dr-stg==1)
dr=stg;
else
stg=mijl;
steagg=0;
}
else
dr=mijl;
mijl=(dr+stg)/2;
}
if(steagg==1)
fprintf(fout,"-1");
else
fprintf(fout,"%d", stg);
fclose(fin);
fclose(fout);
return 0;
}