Cod sursa(job #2077225)

Utilizator HaesteinnSabau Florin Vlad Haesteinn Data 27 noiembrie 2017 20:13:12
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <fstream>
#include <queue>
#include <deque>
#include <climits>
using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");
int xi,yi,xf,yf;
int r,c;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int a[1005][1005],b[1005][1005];
queue <pair <int,int> > q;
deque <pair <int,int> > dq;
bool OK(int i,int j)
{
    if (i>=1&&i<=r&&j>=1&&j<=c&&a[i][j]!=-1)
        return true;
    return false;

}
void citire(int r,int c)
{
    char s;
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
        {
            fin>>s;
            if(s=='.')
                a[i][j]=-2;
            else if(s=='*')
                a[i][j]=-1;
            else if(s=='D')
            {
                q.push(make_pair(i,j));
            }
            else if(s=='O')
            {
                a[i][j]=INT_MAX;
                xi=i;
                yi=j;
            }
            else if(s=='I')
            {
                a[i][j]=INT_MAX;
                xf=i;
                yf=j;
            }
        }
}

void afisare(int r,int c)
{
    for(int i=1;i<=r;i++)
    {
        for(int j=1;j<=c;j++)
            fout<<a[i][j]<<" ";
        fout<<"\n";
    }

}
int main()
{
    int v,x,y;
    fin>>r>>c;
    citire(r,c);


    while(q.empty()==0)
    {
        for(int i=0;i<4;i++)
        {
                if((a[q.front().first][q.front().second]<a[q.front().first+dx[i]][q.front().second+dy[i]]||a[q.front().first+dx[i]][q.front().second+dy[i]]==-2)&&OK(q.front().first+dx[i],q.front().second+dy[i])==true)
                {
                    a[q.front().first+dx[i]][q.front().second+dy[i]]=a[q.front().first][q.front().second]+1;
                    q.push(make_pair(q.front().first+dx[i],q.front().second+dy[i]));
                }
        }
        q.pop();
    }
   // afisare(r,c);
    dq.push_back(make_pair(xi,yi));

    while(dq.empty()==0)
    {
        x=dq.front().first;
        y=dq.front().second;
        dq.pop_front();
        for(int i=0;i<4;i++)
        {
            if(OK(x+dx[i],y+dy[i])==true&&b[x+dx[i]][y+dy[i]]==0)
            {
                b[x+dx[i]][y+dy[i]]=1;
                if(a[x+dx[i]][y+dy[i]]>=a[x][y])
                {
                    dq.push_front(make_pair(x+dx[i],y+dy[i]));
                    a[x+dx[i]][y+dy[i]]=a[x][y];
                }
                else
                {
                    dq.push_back(make_pair(x+dx[i],y+dy[i]));
                }

            }
        }
    }
   // a[xi][yi]=-1;
  //  afisare(r,c);
    if(a[xf][yf]>-1)
        fout<<a[xf][yf];
    else
        fout<<-1;
    return 0;
}