Cod sursa(job #2306031)

Utilizator BotzkiBotzki Botzki Data 21 decembrie 2018 15:39:57
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.04 kb
#include <fstream>
#include <queue>
#include <string>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int NMAX=1000;
int n, m, l;
int matrix[NMAX+5][NMAX+5];
bool viz[NMAX+5][NMAX+5];
int dx[4]={1, 0, -1, 0};
int dy[4]={0, 1, 0, -1};
string s;
struct point
{
    int linie, coloana;
};
//-1 dragon, 1-de unde pleaca barbarul,, -2 -perete
queue <point>q, q2;
int dragoni[NMAX+5][NMAX+5];
void BFS()
{
    int i, j;
    point a, b;
    while(!q.empty())
    {
        a=q.front();
        q.pop();
        for(i=0;i<4;i++)
        {
            b.linie=a.linie+dy[i];
            b.coloana=a.coloana+dx[i];
            if(b.linie>0 and b.linie<=n and b.coloana>0 and b.coloana<=m and dragoni[b.linie][b.coloana]==0)
            {
                dragoni[b.linie][b.coloana]=dragoni[a.linie][a.coloana]+1;
                q.push(b);
            }
        }
    }
}
void BFS2()
{
   int i, j;
   point a, b;
   while(!q2.empty())
    {
        a=q2.front();
        q2.pop();
        q.push(a);
    }
   while(!q.empty())
   {
        a=q.front();
        q.pop();
        for(i=0;i<4;i++)
        {
            b.linie=a.linie+dy[i];
            b.coloana=a.coloana+dx[i];
            if(b.linie>0 and b.linie<=n and b.coloana>0 and b.coloana<=m and matrix[b.linie][b.coloana]==0 and viz[b.linie][b.coloana]==0)
            {
                if(dragoni[b.linie][b.coloana]>l)
                   {
                     viz[b.linie][b.coloana]=1;
                      q.push(b);
                   }
                else
                  q2.push(a);
            }
        }
   }
}
int main()
{
    int i, j;
    point a, st, f;
    fin>>n>>m;
    fin.get();
    for(i=1;i<=n;i++)
    {
        getline(fin, s);
        for(j=0;j<s.size();j++)
        {
            if(s[j]=='*')
                {
                    matrix[i][j+1]=-2;
                    dragoni[i][j+1]=-2;
                }
            else
            {
                if(s[j]=='D')
                {
                  matrix[i][j+1]=-1;
                  dragoni[i][j+1]=1;
                  a.linie=i;
                  a.coloana=j+1;
                  q.push(a);
                }
                else
                {
                    if(s[j]=='I')
                    {
                      st.coloana=j+1;
                      st.linie=i;
                      viz[st.linie][st.coloana]=1;
                    }
                    else
                    {
                        if(s[j]=='O')
                        {
                          f.coloana=j+1;
                          f.linie=i;
                        }
                    }
                }
            }
        }
    }
    BFS();
    q2.push(st);
    l=dragoni[st.linie][st.coloana]-1;
    while(l>0)
    {
       BFS2();
       if(viz[f.linie][f.coloana]!=0)
       {
           fout<<l<<"\n";
           return 0;
       }
       l--;
    }
    fout<<"-1"<<"\n";
    return 0;
}