Cod sursa(job #2813041)

Utilizator PopescuMihneaPopescu Mihnea-Valentin PopescuMihnea Data 5 decembrie 2021 17:30:39
Problema Barbar Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.84 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <climits>
#include <set>
#include <iomanip>
#define inf INT_MAX-10000
using namespace std;
ifstream f ("barbar.in");
ofstream g ("barbar.out");
int main()
{
    char s;
    int vmax;
    int n,m,i,j;
    int startx,stopx;
    int starty,stopy;
    queue<pair<int,int>> coada;
    int vx[]= {0, 1,  0, -1};
    int vy[]= {1, 0, -1,  0};
    f>>n>>m;
    int mat[n][m];
    int path[n][m];
    int cpy[n][m];
    int inSet[n][m];
    int tx[n][m],ty[n][m];
    for (i=0; i<n; ++i)
        for (j=0; j<m; ++j)
        {
            f>>s;
            if (s=='.')
                mat[i][j]=-1;
            else if (s=='*')
                mat[i][j]=-300;
            if (s=='D')
            {
                mat[i][j]=0;
                coada.push(make_pair(i,j));
            }
            else
            {
                mat[i][j]=-1;
                if (s=='I')
                {
                    startx=i;
                    starty=j;
                }

                else
                {
                    stopx=i;
                    stopy=j;
                }

            }
            path[i][j]=inf;
            tx[i][j]=ty[i][j]=0;
            cpy[i][j]=s;
            inSet[i][j]=false;
        }
    while (!coada.empty())
    {
        pair<int,int> nod_curent=coada.front();
        int x=nod_curent.first;
        int y=nod_curent.second;
        coada.pop();
        for (i=0; i<4; ++i)
            if (x+vx[i]<m && x+vx[i]>=0 && y+vy[i]<n && y+vy[i]>=0)
                if (mat[x+vx[i]][y+vy[i]]==-1)
                {
                    mat[x+vx[i]][y+vy[i]]=mat[x][y]+1;
                    if (mat[x][y]+1>vmax)
                        vmax=mat[x][y]+1;
                    coada.push(make_pair(x+vx[i],y+vy[i]));
                }
    }
    /*for (i=0; i<n; ++i)
    {
        for (j=0; j<m; ++j)
            g<<std::right<<std::setw(7)<<mat[i][j]<<" ";
        g<<"\n";
    }
    g<<"\n\n\n";*/
    set <pair<int,pair<int,int>>> set_noduri;
    path[startx][starty]=0;
    set_noduri.insert(make_pair(0,make_pair(startx,starty)));
    while (!set_noduri.empty() && !inSet[stopx][stopy])
    {
        pair <int,pair<int,int>> date_nod=*(set_noduri.begin());
        set_noduri.erase(set_noduri.begin());
        int x=date_nod.second.first;
        int y=date_nod.second.second;
        for (i=0; i<4; ++i)
            if (x+vx[i]<m && x+vx[i]>=0 && y+vy[i]<n && y+vy[i]>=0 && cpy[x+vx[i]][y+vy[i]]!='*' && cpy[x+vx[i]][y+vy[i]]!='D')
            {
                if (vmax-mat[x+vx[i]][y+vy[i]]<path[x+vx[i]][y+vy[i]] && !inSet[x+vx[i]][y+vy[i]])
                {
                    path[x+vx[i]][y+vy[i]]=vmax-mat[x+vx[i]][y+vy[i]];
                    inSet[x+vx[i]][y+vy[i]]=true;
                    set_noduri.insert(make_pair(path[x+vx[i]][y+vy[i]],make_pair(x+vx[i],y+vy[i])));
                    tx[x+vx[i]][y+vy[i]]=x;
                    ty[x+vx[i]][y+vy[i]]=y;
                }
            }
    }
    int x=stopx;
    int y=stopy;
    int vmin=inf;
    if (path[stopx][stopy]==inf)
        g<<-1;
    else
    {
        while (x!=startx || y!=starty)
        {
           //g<<x<<" "<<y<<"\n";
            if (mat[x][y]<vmin)
                vmin=mat[x][y];
            //path[x][y]=-1;
            int auxx=x,auxy=y;
            x=tx[auxx][auxy];
            y=ty[auxx][auxy];
        }
        if (mat[x][y]<vmin)
        vmin=mat[x][y];
       //path[x][y]=-1;
        /*for (i=0; i<n; ++i)
        {
            for (j=0; j<m; ++j)
                if (path[i][j]==inf)
                    g<<std::right<<std::setw(7)<<0<<" ";
                else
                    g<<std::right<<std::setw(7)<<path[i][j]<<" ";
            g<<"\n";
        }*/
        g<<vmin;
    }

}