#include <iostream>
using namespace std;
int main() {
freopen("a.out", "w", stdout);
int n;
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << j*n + (n + i - j) % n + 1 << ' ';
}
cout << endl;
}
return 0;
}
Esmė labai paprasta. Jei skirstysim skaičius iš eilės vis kitai grupei, tai gausim kažką tokio: 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16
Kol kas kiekviena grupė turi skirtingas sumas. Kad geriau matytųsi, kaip pasiskirstę dydžiai, iš kiekvieno stulpelio atimsim mažiausią skaičių stulpelyje: 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3
Vienodas sumas gausime tuo atvejų, jei kiekviename stulpelyje perstatysim reikšmes taip, kad kiekvienoj eilutėj būtų vien tik skirtingi skaičiai: 0 3 2 1 1 0 3 2 2 1 0 3 3 2 1 0
Sveikas. Pirmiausia pastebime, kad matricos įstrižainė yra 1, 2, ... , n . Nuo įstrižainės einant žemyn reikšmė mažinama nuo n*n - n + eilNr. O aukštyn - didinama. Viskas turėtų būti aišku, išnagrinėjus kodą. P.S Reikia patikrinti ar įvestas n yra teigiamas skaičius. Bet tai jau palieku padaryti pačiam.
#include <iostream>
using namespace std;
int** fillMatrix(int n);
void printMatrix(int **m, int size);
int main()
{
cout << "Iveskite n ";
int n;
cin >> n;
cout << "\n";
int **m = fillMatrix(n);
printMatrix(m, n);
cin >> n; // tik tam, kad neuzsidarytu konsoles langas
return 0;
}
int** fillMatrix(int n)
{
int **matrix = new int*[n];
for (int i = 0; i < n; i++)
matrix[i] = new int[n];
for (int i = 0; i < n; i++)
{
int nDiag = i + 1;
matrix[i][i] = nDiag;
for (int j = i - 1; j >= 0; j--)
{
nDiag = nDiag + n;
matrix[i][j] = nDiag;
}
nDiag = n * n - n + i + 1;
for (int j = i + 1; j < n; j++)
{
matrix[i][j] = nDiag;
nDiag = nDiag - n;
}
}
return matrix;
}
void printMatrix(int **m, int size)
{
for (int row = 0; row < size; row++)
{
int sum = 0;
for (int column = 0; column < size; column++)
{
sum += m[column][row];
cout << m[column][row] << " ";
}
cout << " sum = " << sum << "\n";
}
return;
}