Cod sursa(job #2129515)

Utilizator aturcsaTurcsa Alexandru aturcsa Data 12 februarie 2018 21:16:06
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
#include <queue>
#include <algorithm>
#define INF 1000000
using namespace std;
int dl[4]= {-1,0,1,0};
int dc[4]= {0,1,0,-1};
ifstream fi("taxe2.in");
ofstream fo("taxe2.out");

int n,m,b;
int A[101][101];
int VIZ[101][101];
int l1,c1,l2,c2;
int cmp(pair<int,int>a,pair<int,int>b)
{
    if(A[a.first][a.second]>A[b.first][b.second])
        return 1;
    return 0;
}
deque < pair<int, int> > Q;
int main()
{
    fi>>b>>n;
    for (int i=1; i<=n; i++)
        for (int j=1; j<=n; j++)
        {
            fi>>A[i][j];
            VIZ[i][j]=INF;
        }
    /// traversare bf modificata
    VIZ[1][1]=0;
    Q.push_back({1,1});
    while (!Q.empty())
    {
        pair <int, int> aux;
        aux=Q.front();
        Q.pop_front();
        pair <int, int> s[3];
        for (int d=0; d<=3; d++)
        {
            int lnou,cnou;
            lnou=aux.first+dl[d];
            cnou=aux.second+dc[d];
            s[d]= {lnou,cnou};
        }
        sort(s,s+3,cmp);
        for (int d=0; d<=3; d++)
        {
            int lnou,cnou;
            lnou=s[d].first;
            cnou=s[d].second;
            int mini=INF;
            if (lnou>=1 && lnou<=n && cnou>=1 && cnou<=m)
                    if (VIZ[lnou][cnou]+A[lnou][cnou]<mini)
                    {
                        VIZ[lnou][cnou]=3;
                        Q.push_back({lnou,cnou});
                    }
                else
                {
                    if (VIZ[lnou][cnou]>VIZ[aux.first][aux.second]+1)
                    {
                        VIZ[lnou][cnou]=VIZ[aux.first][aux.second]+1;
                        Q.push_back({lnou,cnou});
                    }
                }
        }
    }
    fo<<VIZ[l2][c2];

fi.close();
fo.close();
return 0;
}