Pagini recente » Cod sursa (job #1619243) | Cod sursa (job #910199) | Cod sursa (job #1980690) | Cod sursa (job #1729854) | Cod sursa (job #1249257)
#include <stdio.h>
#define NIL -1
#define MAXN 1000
#define NRDIR 4
int dirlin[NRDIR]=
{
-1, 0, 1, 0
};
int dircol[NRDIR]=
{
0, 1, 0, -1
};
int m[MAXN+2][MAXN+2], ok[MAXN+2][MAXN+2], coadaL[MAXN*MAXN], coadaC[MAXN*MAXN], nrlin, nrcol, st, dr, l1, l2, c1, c2;
inline void bordare(){
int i;
for(i=0; i<=nrlin+1; i++){
m[i][0]=NIL;
m[i][nrcol+1]=NIL;
}
for(i=0; i<=nrcol+1; i++){
m[0][i]=NIL;
m[nrlin+1][i]=NIL;
}
}
inline void calc_dist(){
int l, c, x, i;
while(st<dr){
l=coadaL[st];
c=coadaC[st++];
x=m[l][c]+1;
if(x==0){
x++;
}
for(i=0; i<NRDIR; i++){
if(m[l+dirlin[i]][c+dircol[i]]==0){
m[l+dirlin[i]][c+dircol[i]]=x;
coadaL[dr]=l+dirlin[i];
coadaC[dr++]=c+dircol[i];
}
}
}
}
inline int posibil(int dist){
int i, j, l, c, lin, col;
for(i=1; i<=nrlin; i++){
for(j=1; j<=nrcol; j++){
ok[i][j]=0;
}
}
coadaL[0]=l1;
coadaC[0]=c1;
ok[l1][c1]=1;
st=0;
dr=1;
while((st<dr)&&(ok[l2][c2]==0)){
l=coadaL[st];
c=coadaC[st++];
for(i=0; i<NRDIR; i++){
lin=l+dirlin[i];
col=c+dircol[i];
if((ok[lin][col]==0)&&(m[lin][col]>=dist)){
ok[lin][col]=1;
coadaL[dr]=lin;
coadaC[dr++]=col;
}
}
}
return ok[l2][c2];
}
int main(){
int i, j, rez, pas;
char ch;
FILE *fin, *fout;
fin=fopen("barbar.in", "r");
fout=fopen("barbar.out", "w");
fscanf(fin, "%d%d ", &nrlin, &nrcol);
st=0;
dr=0;
for(i=1; i<=nrlin; i++){
for(j=1; j<=nrcol; j++){
ch=fgetc(fin);
if(ch=='*'){
m[i][j]=NIL;
}else if(ch=='D'){
m[i][j]=NIL;
coadaL[dr]=i;
coadaC[dr++]=j;
}else if(ch=='I'){
l1=i;
c1=j;
}else if(ch=='O'){
l2=i;
c2=j;
}
}
fgetc(fin);
}
bordare();
calc_dist();
rez=0;
for(pas=1<<9; pas!=0; pas>>=1){
if((rez+pas<=m[l1][c1])&&(rez+pas<=m[l2][c2])&&(posibil(rez+pas)==1)){
rez+=pas;
}
}
if(rez==0){
fprintf(fout, "-1\n");
}else{
fprintf(fout, "%d\n", rez);
}
fclose(fin);
fclose(fout);
return 0;
}