fbpx

Problema #3417 – GenMat28 – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Scrieți un program care citește de la tastatură un număr natural n și construiește o matrice cu n linii și n coloane ale cărei elemente vor primi valori dupa cum urmează:

  • În colțul din stânga sus, de coorodnate 1 1, va fi 1.
  • În pozițiile adiacente, de coordonate 1 2 și 2 1, va fi n.
  • În pozițiile adiacente, de coordonate 1 3, 2 2 și 3 1, va fi 2.
  • În pozițiile adiacente, de coordonate 1 4, 2 3, 3 2 și 4 1, va fi n-1.
  • Și așa mai departe…
  • În penultimele poziții, de coordonate n-1 n și n n-1, va fi n.
  • În ultima poziție, de coordonate n n, va fi 1.

Date de intrare

Programul citește de la tastatură numarul n.

Date de ieșire

Programul afișează pe ecran matricea construită, câte o linie a matricei pe câte o linie a ecranului, elementele fiecărei linii fiind separate prin câte un spaţiu.

Restricții și precizări

  • 3 ≤ n ≤ 30

Exemplu

Intrare

5

Ieșire

1 5 2 4 3
5 2 4 3 4
2 4 3 4 2
4 3 4 2 5
3 4 2 5 1

Explicație

S-a citit 5 și se afisează o matrice de 5 linii și 5 coloane, unde 1 se află in colțul din stânga sus, apoi în pozițiile învecinate se află 5, apoi 2 și tot așa până se va completa matricea.

#include <bits/stdc++.h>

using namespace std;

int n, di[]={0,0,-2,2,1,-1}, dj[]={-2,2,0,0,1,-1}, a[101][101];

bool inmat(int i, int j){
    return i <= n && j <= n && i >= 1 && j >= 1;
}

queue<pair<int, pair<int, int>>> Q;

void lee(){
    while(!Q.empty()){
        int cost = Q.front().first;
        int i = Q.front().second.first;
        int j = Q.front().second.second;
        for(int d = 0; d <= 5; ++d){
            int inou = i + di[d];
            int jnou = j + dj[d];
            if(inmat(inou, jnou) && a[inou][jnou] == 0){
                a[inou][jnou] = cost + 1;
                Q.push({cost + 1, {inou,jnou}});
            }
        }
        Q.pop();
    }
}

void lee1(){
    while(!Q.empty()){
        int cost = Q.front().first;
        int i = Q.front().second.first;
        int j = Q.front().second.second;
        for(int d = 0; d <= 5; ++d){
            int inou = i + di[d];
            int jnou = j + dj[d];
            if(inmat(inou, jnou) && a[inou][jnou] == 0){
                a[inou][jnou] = cost - 1;
                Q.push({cost - 1, {inou,jnou}});
            }
        }
        Q.pop();
    }
}

int main(){
    cin >> n;
    Q.push({1, {1,1}});
    Q.push({1, {n,n}});
    a[1][1] = 1, a[n][n] = 1;
    a[2][1] = n, a[n][n-1] = n;
    a[1][2] = n, a[n-1][n] = n;
    lee();
    Q.push({n, {2, 1}});
    Q.push({n, {1, 2}});
    Q.push({n, {n, n-1}});
    Q.push({n, {n-1, n}});
    lee1();
    for(int i = 1; i <= n; ++i, cout << '\n')
        for(int j = 1; j <= n; ++j)
            cout << a[i][j] << ' ';
    return 0;
}
Comentarii

S-ar putea sa iti placa