Cod sursa(job #217492)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 28 octombrie 2008 19:54:27
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <stdio.h>
#include <queue>
#include <bitset>
#define inf 32000
using namespace std;
long n,m,i,j,k,f,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");
    }*/
    v[x2][y2]=-1;
    Qx.push(x1);Qy.push(y1);v[x1][y1]=d[x1][y1];mk[x1][y1]=1;
    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 (a[xx][yy]!='*'){
                 f=min(v[x][y],d[xx][yy]);
                 if (v[xx][yy]<f){
                    v[xx][yy]=f;
                    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");
    }*/
    if (v[x2][y2]==inf || v[x2][y2]==-1)printf("-1\n");
    else printf("%d\n",v[x2][y2]);
return 0;
}