Pagini recente » Cod sursa (job #2552800) | Cod sursa (job #308642) | Cod sursa (job #531451) | Cod sursa (job #2125212) | Cod sursa (job #1866208)
#include<stdio.h>
#define NMAX 1005
#define INITMAX 2005
#define GOL 1// sa nu coincida cu 0 care v-a fi bordura matr
#define OBS 2
#define FIRE 3
#define POZ1 4
#define POZ2 5
char a[NMAX][NMAX];
struct poz{
int l,c;
} stiv[NMAX*NMAX]; // ?? "<"
int viz[NMAX][NMAX];
int sol[NMAX][NMAX];
const int dirlin[] = {-1,0,1,0};
const int dircol[] = {0,1,0,-1};
int main (){
FILE *in, *out;
in = fopen ("barbar.in","r");
out = fopen ("barbar.out","w");
int n,m,i,j,l1,c1,l2,c2,lin,col;
int inc,sf,minim;
char c;
fscanf (in,"%d%d",&n,&m);
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
viz[i][j] = -1;
inc = 1; sf = 0; // coada "stiv"
for (i=1;i<=n;i++){
fscanf (in," ");
for (j=1;j<=m;j++){
c = fgetc (in);
if (c == '.')
a[i][j] = GOL;
else if (c == '*')
a[i][j] = OBS;
else if (c == 'D'){
a[i][j] = FIRE;
sf ++;
stiv[sf].l = i; stiv[sf].c = j;
viz[i][j] = 0;
}
else if (c == 'I'){
l1 = i;c1 = j;
a[i][j] = POZ1;
}
else if (c == 'O'){
l2 = i;c2 = j;
a[i][j] = POZ2;
}
}
}
/// inc = 1; sf
while (inc <= sf){// in matr viz vor aparea dist pana cel mai apropiat dragon
lin = stiv[inc].l; col = stiv[inc].c;
for (i=0;i<4;i++){
if (a[lin+dirlin[i]][col+dircol[i]] == GOL)
if (viz[lin+dirlin[i]][col+dircol[i]] == -1){
viz[lin+dirlin[i]][col+dircol[i]] = viz[lin][col] + 1;
sf ++;
stiv[sf].l = lin+dirlin[i]; stiv[sf].c = col+dircol[i];
}
}
inc ++;
}
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
sol[i][j] = INITMAX;
viz[l1][c1] = viz[l2][c2] = INITMAX;
inc = sf = 1;
stiv[inc].l = l1; stiv[inc].c = c1;
while (inc <= sf){
lin = stiv[inc].l; col = stiv[inc].c;
for (i=0;i<4;i++){
if (viz[lin+dirlin[i]][col+dircol[i]] != 0)//diferit de dragon si diferit de bordura
if (viz[lin+dirlin[i]][col+dircol[i]] != -1){
minim = sol[lin][col] < viz[lin+dirlin[i]][col+dircol[i]] ? sol[lin][col] : viz[lin+dirlin[i]][col+dircol[i]];
if (sol[lin+dirlin[i]][col+dircol[i]] == INITMAX){
sol[lin+dirlin[i]][col+dircol[i]] = minim;// cel mai apropiat dargon pe trasel pana in punctul asta
sf ++;
stiv[sf].l = lin + dirlin[i]; stiv[sf].c = col + dircol[i];
}
else
sol[lin+dirlin[i]][col+dircol[i]] = sol[lin+dirlin[i]][col+dircol[i]] > minim ? sol[lin+dirlin[i]][col+dircol[i]] : minim;//alegem dist de pe traseul mai bun
}
}
inc ++;
}
if (sol[l2][c2] == INITMAX)
fprintf (out,"-1");
else
fprintf (out,"%d",sol[l2][c2]);
fclose (in);
fclose (out);
return 0;
}