Cod sursa(job #2112092)

Utilizator Mihnea_BranzeuMihnea Branzeu Mihnea_Branzeu Data 22 ianuarie 2018 23:31:07
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int dl[]={-1,0,1,0};
const int dc[]={0,1,0,-1};
const int N=1002;
int d[N][N],b[N][N];
struct poz{
int l,c;
};
poz q[N*N];
int main()
{
    int m,n,i,j,st,dr,vmin;
    st=0; dr=-1;
    poz barbar,iesire,x,y;
    char t;
    //citire
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
    {
        fin>>t;
        if(t=='.')
        {
            d[i][j]=-1;
            b[i][j]=-1;
        }
        else if(t=='*')
        {
            d[i][j]=-2;
            b[i][j]=-2;
        }
        else if(t=='D')
        {
            b[i][j]=-2;
            d[i][j]=1;
            q[++dr]=(poz){i,j};
        }
        else if(t=='I')
        {
            barbar=(poz){i,j};
            b[i][j]=1;
            d[i][j]=-1;
        }
        else if(t=='O')
        {
            iesire=(poz){i,j};
            d[i][j]=-1;
            b[iesire.l][iesire.c]=-1;
        }
    }
        //bordare
        for(i=0;i<=n+1;i++)
            b[i][0]=d[i][0]=b[i][m+1]=d[i][m+1]=-2;
        for(j=0;j<=m+1;j++)
            b[0][j]=d[0][j]=b[n+1][j]=d[n+1][j]=-2;

         while(st<=dr)
    {
        x=q[st++];
        for(i=0;i<4;i++){
            y.l=x.l+dl[i];
            y.c=x.c+dc[i];
            if(d[y.l][y.c]==-1)
            {
                q[++dr]=y;
                d[y.l][y.c]=1+d[x.l][x.c];
            }
    }
    }
    /*for(i=0;i<=n+1;i++)
        {
            for(j=0;j<=m+1;j++)
                fout<<b[i][j]<<" ";
            fout<<"\n";
        }*/
      st=0; dr=-1;
      q[++dr]=barbar;
      vmin=N;
      while(st<=dr)
      {
          x=q[st++];
          if(d[x.l][x.c]<=vmin)
            vmin=d[x.l][x.c];
          for(i=0;i<4;i++)
          {
              y.l=x.l+dl[i];
              y.c=x.c+dc[i];
              if(b[y.l][y.c]==-1)
              {
                  q[++dr]=y;
                  b[y.l][y.c]=1+b[x.l][x.c];
              }
          }
      }
      /*for(i=0;i<=n+1;i++)
        {
            for(j=0;j<=m+1;j++)
                fout<<d[i][j]<<" ";
            fout<<"\n";
        }
      fout<<"\n";*/
     if(b[iesire.l][iesire.c]==-1) fout<<"-1";
     else fout<<vmin;


    return 0;
}