Cod sursa(job #2686602)

Utilizator ArambasaVlad Arambasa Arambasa Data 19 decembrie 2020 12:02:29
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <queue>
#define NMax 180
using namespace std;
int mat[NMax][NMax],N,M;
pair<int,int> P_Start, P_Finish;
ifstream in ("alee.in");
ofstream out ("alee.out");
int di[]={0,0,-1,1};
int dj[]={-1,1,0,0};
bool valid(int a, int b)
{
    if(a<N && a>=0 && b<N && b>=0 && mat[a][b]==0)

        return true;

    return false;
}
void Read()
{
    in>>N>>M;
    pair<int,int> aux;
    for(int i=0;i<M;i++)
    {
        in>>aux.first>>aux.second;//CITESC POZITIA POMULUI
        aux.first--;
        aux.second--;
        mat[aux.first][aux.second]=-1;//OBSTACOL
    }
    in>>P_Start.first>>P_Start.second;
    in>>P_Finish.first>>P_Finish.second;
    P_Start.first--;
    P_Start.second--;
    P_Finish.first--;
    P_Finish.second--;
}
void Solve()
{
    queue< pair<int,int> > Q;
    mat[P_Start.first][P_Start.second]=1;
    pair<int,int> el;//FIRST -> I, SECOND -> J
    Q.push(P_Start);//ADAUG
    while(!Q.empty())//CAT TIMP Q NU E GOL : Q.empty()==false
    {
        el=Q.front();//el devine primul element din Q
        Q.pop();//elimin din Q primul element ce a fost anterior memorat in el.
        //VERIFICARE VECINI
        for(int k=0;k<4;k++)
        {
            int vi,vj;//INDICII VECINULUI
            vi=el.first+di[k];
            vj=el.second+dj[k];
            if(valid(vi,vj)==true)//DACA VECINUL E VALID
            {
                mat[vi][vj]=mat[el.first][el.second]+1; //VALOAREA POZITIEI CURENTE PLUS 1.
                Q.push(make_pair(vi,vj));//MAKE PAIR CREEAZA O PERECHE TEMPORARA SI O ARUNCA IN Q.
                if(vi==P_Finish.first&&vj==P_Finish.second)//daca vecinu e poarta de iesire
                    return; //ca sa iesi din functia solve.
            }
        }
    }
}
void Print()
{
    out<<mat[P_Finish.first][P_Finish.second];
}
int main()
{
    Read();
    Solve();
    Print();
    return 0;
}