top of page

Alee

Parcul orasului a fost neglijat mult timp, astfel ca acum toate aleile sunt distruse. Prin urmare, anul acesta Primaria si-a propus sa faca reamenajari. Parcul are forma unui patrat cu latura de N metri si este inconjurat de un gard care are exact doua porti. Proiectantii de la Primarie au realizat o harta a parcului si au trasat pe harta un caroiaj care imparte parcul in N*N zone patrate cu latura de 1 metru. Astfel harta parcului are aspectul unei matrice patratice cu N linii si N coloane. Liniile si, respectiv, coloanele sunt numerotate de la 1 la N. Elementele matricei corespund zonelor patrate de latura 1 metru. O astfel de zona poate sa contina un copac sau este libera. Edilii orasului doresc sa paveze cu un numar minim de dale patrate cu latura de 1 metru zonele libere (fara copaci) ale parcului, astfel incat sa se obtina o alee continua de la o poarta la alta.

Scrieti un program care sa determine numarul minim de dale necesare pentru construirea unei alei continue de la o poarta la cealalta.

Date de intrare

Fisierul de intrare alee.in contine pe prima linie doua valori naturale N si M separate printr-un spatiu, reprezentand dimensiunea parcului, respectiv numarul de copaci care se gasesc in parc. Fiecare dintre urmatoarele M linii contine cate doua numere naturale X si Y separate printr-un spatiu, reprezentand pozitiile copacilor in parc (X reprezinta linia, iar Y reprezinta coloana zonei in care se afla copacul). Ultima linie a fisierului contine patru numere naturale X1, Y1, X2, Y2, separate prin cate un spatiu, reprezentand pozitiile celor doua porti ( X1, Y1 reprezinta linia si respectiv coloana zonei ce contine prima poarta, iar X2, Y2 reprezinta linia si respectiv coloana zonei ce contine cea de a doua poarta).

Date de ieșire

Fisierul de iesire alee.out va contine o singura linie pe care va fi scris un numar natural care reprezinta numarul minim de dale necesare pentru construirea aleii.

Restricții si precizări

  • 1 ≤ N ≤ 175

  • 1 ≤ M ≤ N*N

  • Aleea este continua daca oricare doua placi consecutive au o latura comuna.

  • Aleea incepe cu zona unde se gaseste prima poarta si se termina cu zona unde se gaseste cea de a doua poarta.

  • Pozitiile portilor sunt distincte si corespund unor zone libere.

  • Pentru datele de test exista intotdeauna solutie.

Exemplu

Heading 1

Implementare

#include <iostream>

#include <fstream>

#include <queue>

#define dim 177

 

using namespace std;

 

ifstream f ("alee.in");

ofstream g ("alee.out");

 

int dx[] ={0,1,0,-1};

int dy[] ={-1,0,1,0};

short a[dim][dim], n , x , y , k,start_x,start_y,stop_x,stop_y;

 

void read()

{

    f >> n >> k;

    for(int i = 1;i <= k;i++)

        f >> x >> y , a[x][y] = -1;

 

    f >> start_x >> start_y >> stop_x >> stop_y;

}

 

bool bun(int x,int y)

{

    if(a[x][y] != 0)

        return false;

    if(x > n || x < 1 || y > n || y < 1)

        return false;

    return true;

}

 

void lee()

{

    int new_x,new_y;

    queue < pair < int,int > > Q;

    Q.push(make_pair(start_x , start_y));

    a[start_x][start_y] = 1;

 

    while(not Q.empty())

    {

        x = Q.front().first;

        y = Q.front().second;

        Q.pop();

 

        if(x == stop_x && y == stop_y)

            break;

 

        for(int i = 0;i <= 3;i++)

        {

            new_x = x + dx[i];

            new_y = y + dy[i];

 

            if(bun(new_x,new_y))

                Q.push(make_pair(new_x,new_y)) , a[new_x][new_y] = a[x][y] + 1;

        }

    }

}

 

int main()

{

    read();

    lee();

 

    g << a[stop_x][stop_y];

    return 0;

}

bottom of page