Cod sursa(job #217468)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 28 octombrie 2008 18:45:40
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <stdio.h>
#include <queue>
#include <bitset>
#define inf 32000
using namespace std;
long n,m,i,j,k,x1,x2,y1,y2,x,y,xx,yy;
long dx[]={-1,0,1,0},dy[]={0,1,0,-1};
short int d[1001][1024],v[1001][1024];
char a[1001][1024];
bitset <1024>mk[1001];
queue <short int> Qx,Qy;

int main(){
    freopen("barbar.in","r",stdin);freopen("barbar.out","w",stdout);
    scanf("%ld %ld\n",&n,&m);
    for (i=1;i<=n;++i)
        for (j=1;j<=n;++j)
            d[i][j]=inf;
    for (i=1;i<=n;++i){
        scanf("%s\n",a[i]+1);
        for (j=1;j<=m;++j)
            if (*(a[i]+j)=='D'){Qx.push(i);Qy.push(j);d[i][j]=0;mk[i][j]=1;}
            else if (*(a[i]+j)=='I'){x1=i;y1=j;}
                 else if (*(a[i]+j)=='O'){x2=i;y2=j;}
    }
    while (!Qx.empty()){
          x=Qx.front();Qx.pop();y=Qy.front();Qy.pop();
          mk[x][y]=0;
          for (k=0;k<4;++k){
              xx=x+dx[k];yy=y+dy[k];
              if (xx && xx<=n && yy && yy<=m)
                 if (d[xx][yy]>d[x][y]+1){
                    d[xx][yy]=d[x][y]+1;
                    if (!mk[xx][yy]){mk[xx][yy]=1;Qx.push(xx);Qy.push(yy);}
                 }
          }
    }
    /*for (i=1;i<=n;++i){
        for (j=1;j<=m;++j)
            printf("%ld ",d[i][j]);
        printf("\n");
    }*/
    Qx.push(x1);Qy.push(y1);v[x1][y1]=d[x1][y1];
    while (!Qx.empty()){
          x=Qx.front();Qx.pop();y=Qy.front();Qy.pop();
          mk[x][y]=0;
          for (k=0;k<4;++k){
              xx=x+dx[k];yy=y+dy[k];
              if (xx && xx<=n && yy && yy<=m)
                 if (v[xx][yy]<min(v[x][y],d[xx][yy])){
                    v[xx][yy]=min(v[x][y],d[xx][yy]);
                    if (!mk[xx][yy]){mk[xx][yy]=1;Qx.push(xx);Qy.push(yy);}
                 }
          }
    }
    /*for (i=1;i<=n;++i){
        for (j=1;j<=m;++j)
            printf("%ld ",v[i][j]);
        printf("\n");
    }*/
    printf("%ld\n",v[x2][y2]);
return 0;
}