Cod sursa(job #22499)

Utilizator Spike7d5Spike7d5 Spike7d5 Data 26 februarie 2007 18:55:45
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <stdio.h>
#define M1  1005
#define M2  1000005
#define INF 1000000

const int dx[4]={0, 0, -1, 1}, dy[4]={-1, 1, 0, 0};
int minim (int a, int b) { return a<b?a:b; }

int n, m, i, j, safe[M1][M1], sol[M1][M1], xi, yi, xf, yf, x0, y0, x1, y1;
int cx[M2], cy[M2], cs, cd;
char t[M1][M1];

int main () {
freopen ("barbar.in", "r", stdin);
freopen ("barbar.out", "w", stdout);

scanf ("%d %d\n", &n, &m);
cs=0; cd=-1;
for (i=1;i<=n;i++) {
  for (j=1;j<=m;j++) {
    safe[i][j]=INF;
    sol[i][j]=0;
    scanf ("%c", &t[i][j]);
    if (t[i][j]=='D') { safe[i][j]=0; cd++; cx[cd]=i; cy[cd]=j; }
    if (t[i][j]=='I')
    { xi=i; yi=j; }
    if (t[i][j]=='O') { xf=i; yf=j; } }
  scanf ("\n"); }

for (i=0;i<=n+1;i++) { t[i][0]='*'; t[i][m+1]='*'; }
for (i=0;i<=m+1;i++) { t[0][i]='*'; t[n+1][i]='*'; }

while (cs!=cd+1) {
  for (i=0;i<4;i++) {
    x0=cx[cs];   y0=cy[cs];
    x1=x0+dx[i]; y1=y0+dy[i];
    if (t[x1][y1]!='*' && safe[x1][y1]>safe[x0][y0]+1) {
      safe[x1][y1]=safe[x0][y0]+1;
      cd=(cd+1)%M2;
      cx[cd]=x1;
      cy[cd]=y1; } }
  cs=(cs+1)%M2; }

cs=cd=0;
cx[0]=xi; cy[0]=yi;
sol[xi][yi]=safe[xi][yi];
while (cs!=cd+1) {
  for (i=0;i<4;i++) {
    x0=cx[cs];   y0=cy[cs];
    x1=x0+dx[i]; y1=y0+dy[i];
    if (t[x1][y1]!='*') {
      xi=minim(sol[x0][y0], safe[x1][y1]);
      if (sol[x1][y1]<xi) {
	sol[x1][y1]=xi;
	cd=(cd+1)%M2;
	cx[cd]=x1;
	cy[cd]=y1; } } }
  cs=(cs+1)%M2; }

if (sol[xf][yf]>0)
  printf ("%d\n", sol[xf][yf]);
else
  printf ("-1\n");

return 0;
}