Cod sursa(job #2097697)

Utilizator BiancaMariaVulsanVulsan Bianca Maria BiancaMariaVulsan Data 1 ianuarie 2018 13:37:42
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 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;
}


int main()
{
    int i,ii,jj,k,j,ok=0,sol=0;
    citire();
    bordare();
    lee();
    //afis();
    int st=1, dr=max(m,n), mij;
    while(st<=dr)
    {
        mij=st+(dr-st)/2;
        if(mij>a[i1][j1])
        {
            dr=mij-1; continue;//
        }
        else
        {
            ok=0;
            while(!c1.empty()) {c1.pop(); c2.pop();}//
            a1[i1][j1]=mij; //afis(); cout<<endl;
            c1.push(i1); c2.push(j1);
            while(!c1.empty() && ok==0)
            {
                i=c1.front(); j=c2.front();
                c1.pop(); c2.pop();
                for(k=0; k<4; k++)
                {
                    ii=i+dx[k]; jj=j+dy[k];
                    if(a1[ii][jj]!=-1)
                    if(mij<=a[ii][jj] && a1[ii][jj]!=mij)
                    {
                        c1.push(ii); c2.push(jj);
                        a1[ii][jj]=mij;
                        if(ii==i2 && jj==j2)
                          {ok=1;}
                    }

                }
            }
        }
       if(ok)
            {st=mij+1; sol=1;}
       else
          dr=mij-1;
    }
    if(sol) g<<dr-1;
    else g<<-1;

    f.close();
    g.close();
    return 0;
}