328
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 fi1. - În pozițiile adiacente, de coordonate
1 2și2 1, va fin. - În pozițiile adiacente, de coordonate
1 3,2 2și3 1, va fi2. - În pozițiile adiacente, de coordonate
1 4,2 3,3 2și4 1, va fin-1. - Și așa mai departe…
- În penultimele poziții, de coordonate
n-1 nșin n-1, va fin. - În ultima poziție, de coordonate
n n, va fi1.
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