Cod sursa(job #882668)

Utilizator petrea.mariuspetrea marius petrea.marius Data 19 februarie 2013 12:19:57
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
//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;
}