Pagini recente » Cod sursa (job #1258756) | Cod sursa (job #2901984) | Cod sursa (job #2902175) | Cod sursa (job #1497797) | Cod sursa (job #882668)
Cod sursa(job #882668)
//problema extraterestri vegetali clasa x locala sv 2013
//un punct de plecare, unul de sosire intr-un caroiaj, se cere cel mai scurt drum de la plecare la sosire cu obstacole
//lee cu ajutorul stl: queue(coada de perechi), pair
#include<fstream>
#include <queue> // pt queue
#include <algorithm> // pt pair
#define mkp make_pair
#define ff first
#define ss second
#define punct pair<int,int>
using namespace std;
int A[176][176], D[176][176];
int n,m;
punct start, end;
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};
void initializare()
{
int i,j;
//init matricea drumurilor cu 2000000000
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
D[i][j]=2000000000;
//bordam matricea A cu -1
//mai intai linia 0
for(j=0;j<=n+1;j++)
A[0][j]=-1;
//coloana n+1
for(i=1;i<=n+1;i++)
A[i][n+1]=-1;
//linia n+1
for(j=0;j<=n;j++)
A[n+1][j]=-1;
//coloana 0
for(i=1;i<=n;i++)
A[i][0]=-1;
//marcam punctul de plecare cu 1 in matricea D
D[start.ff][start.ss]=1;
}
void citire()
{
//punem -2 daca celula e ocupata de extraterestri, memoram in start si end punctele de plecare si sosire
int i, linie, col;
ifstream fin("1_extra.in");
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>linie>>col;
A[linie][col]=-2;
}
fin>>start.ff>>start.ss>>end.ff>>end.ss;
fin.close();
}
int afara(int linie, int col)
{
//verificam daca nu s-a iesit din matrice
return A[linie][col]!=-1;
}
int lee()
{
int i;
initializare(); // initializam matricea D cu infinit, marginile cu -1 si punctul de inceput cu 1
queue<punct> Q;
punct now, now2;
Q.push(start); // bagam punctul de inceput in coada
while (Q.empty() == false)
{ // cat timp coada nu e vida
now = Q.front(); Q.pop(); // eliminam nodul din fata din coada
if (now == end) // daca se poate returnam minimul
return D[end.ff][end.ss];
for (i = 0; i < 4; ++i)
{ // parcurgem vecinii
now2 = mkp(now.ff + dx[i], now.ss + dy[i]);
if (afara(now2.ff,now2.ss)==1 && D[now2.ff][now2.ss] > D[now.ff][now.ss] + 1 && A[now2.ff][now2.ss] != -2)
{
// daca se poate ajunge cu cost mai bun si nu e ocupata casuta (sa zicem ca unele casute sunt ocupate, depinde de enuntul problemei
D[now2.ff][now2.ss] = D[now.ff][now.ss] + 1; // modificam costul
Q.push(now2); // bagam in coada nodul curent
}
}
}
return -1; //daca se ajunge aici inseamna ca nu se poate ajunge la destinatie
}
int main()
{
citire();
int rez=lee();
ofstream fout("extra.out");
fout<<rez;
return 0;
}