Cod sursa(job #2097692)

Utilizator BiancaMariaVulsanVulsan Bianca Maria BiancaMariaVulsan Data 1 ianuarie 2018 13:31:50
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <iostream>
#include <fstream>
#include <limits.h>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,m, a[1001][1001], i1,j1,i2,j2, a1[1001][1001];
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};

queue<int> c1,c2;

void bordare()
{
    int i,j;
    for(i=0; i<=n+1; i++)
    {a[i][0]=-1; a[i][m+1]=-1; a1[i][0]=-1; a1[i][m+1]=-1;}
    for(j=1; j<=m+1; j++)
    {a[0][j]=-1; a[m+1][j]=-1; a1[0][j]=-1; a1[m+1][j]=-1;}
}

void citire()
{
   char c;
   int i,j;
   f>>n>>m;
   for(i=1; i<=n; i++)
     for(j=1; j<=m; j++)
   {
       f>>c;
       if(c=='*')
       a[i][j]=-1;//perete
       if(c=='D')//dragon
       {a[i][j]=1; c1.push(i); c2.push(j);}
       if(c=='I')
       {i1=i; j1=j;}
       if(c=='O')
       {i2=i; j2=j;}

   }
}

void lee()
{
   int ii,jj,i,j,k,pas;

   while(!c1.empty())
   {
       i=c1.front(); j=c2.front();
       c1.pop();     c2.pop();
       pas=a[i][j];
        for(k=0; k<4; k++)
        {
            ii=i+dx[k]; jj=j+dy[k];
            if(a[ii][jj]==0)
            {
                c1.push(ii); c2.push(jj);
                a[ii][jj]=pas+1;
            }
        }
   }

}
void afis()
{
    int i,j;
    for(i=1; i<=n; i++)
    {for(j=1; j<=m; j++)
        cout<<a1[i][j]<<" ";
        cout<<endl;}cout<<endl;
}

void filla(int x, int y, int pas)
{
    if(x==i2 && y==j2)
        {
            a1[x][y]=pas;
            //afis();
        }
    else
    {
        if(a[x][y]>1)
        if(pas<=a[x][y] && a1[x][y]!=pas)
        {a1[x][y]=pas;
        filla(x,y+1,pas);
        filla(x+1,y,pas);
        filla(x-1,y,pas);
        filla(x,y-1,pas);
        }
    }
}

int main()
{
    int i,ok=0;
    citire();
    bordare();
    lee();
    //afis();
    //filla(i1,j1,2);
    for(i=max(n,m); i>=2; i--)
    {
        filla(i1,j1,i);
        if(a1[i2][j2]==i)
        {
            g<<i-1; ok=1; break;
        }
    }
    if(!ok) g<<-1;
    f.close();
    g.close();
    return 0;
}