Cod sursa(job #2813003)

Utilizator PopescuMihneaPopescu Mihnea-Valentin PopescuMihnea Data 5 decembrie 2021 16:56:07
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.7 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]=-2;
            else if (s=='D')
            {
                mat[i][j]=0;
                coada.push(make_pair(i,j));
            }
            else
            {
                mat[i][j]=-3;
                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)
            mat[i][j]=vmax-mat[i][j];
    /*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())
    {
        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 (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]]=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;
    while (x!=startx || y!=starty)
    {
        //g<<x<<" "<<y<<"\n";
        if (vmax-mat[x][y]<vmin && mat[x][y]<vmax)
            vmin=vmax-mat[x][y];
        //path[x][y]=-1;
        int auxx=x,auxy=y;
        x=tx[auxx][auxy];
        y=ty[auxx][auxy];
    }
    /*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;
}