Pagini recente » Cod sursa (job #87491) | Cod sursa (job #78629) | Cod sursa (job #222601) | Cod sursa (job #3290062) | Cod sursa (job #2686602)
#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;
}