Răspuns :
Răspuns:
patrat_magic1
#include <bits/stdc++.h>
using namespace std;
/** # desen tehnic
0 0 N N N N 0 0
0 0 N N N N 0 0
V V 0 0 0 0 E E
V V 0 0 0 0 E E
V V 0 0 0 0 E E
V V 0 0 0 0 E E
0 0 S S S S 0 0
0 0 S S S S 0 0
**/
int main()
{
int nr = 1, n, a[101][101];
cin>>n;
/// generare clasica
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
a[i][j] = nr++;
/// vom roti elem patratului din zonele N, S, E si V cu 180 grade
/// N - S
for(int k=0; k<n/4; ++k)
{
int pas = 1;
for(int x=k, y=n/4, i=n-k-1, j=3*n/4-1; pas<=n/2; ++y, --j, ++pas)
swap(a[x][y], a[i][j]);
}
/// V - E
for(int k=0; k<n/4; ++k)
{
int pas = 1;
for(int x=n/4, y=k, i=3*n/4-1, j=n-k-1; pas<=n/2; ++x, --i, ++pas)
swap(a[x][y], a[i][j]);
}
/// afisare
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
cout<<a[i][j]<<' ';
cout<<'\n';
}
return 0;
}
patrat_magic0
#include <iostream>
using namespace std;
bool f[1000000];
int a[1000][1000];
int main()
{
int n;
bool magic = true;
cin>>n;
for(int i=0;i<n;++i)
for(int j=0;j<n;++j){
cin>>a[i][j];
if(a[i][j]>n*n || a[i][j]<1) magic = false;
if(f[a[i][j]] == 0) f[a[i][j]] = 1;
else magic = false;
}
int s, c;
/// diagonalele + constanta
int s1 = 0, s2 = 0;
for(int i=0;i<n;++i)
s1+=a[i][i], s2+=a[i][n-i-1];
if(s1!=s2) magic = false, c=0;
else c = s1;
/// liniile
for(int i=0;i<n;++i)
{
s=0;
for(int j=0;j<n;++j)
s+=a[i][j];
if(s!=c) magic = false;
}
/// coloanele
for(int i=0;i<n;++i)
{
s=0;
for(int j=0;j<n;++j)
s+=a[j][i];
if(s!=c) magic = false;
}
cout<<boolalpha<<magic;
return 0;
}
Explicație:
Vă mulțumim pentru vizita pe site-ul nostru dedicat Informatică. Sperăm că informațiile oferite v-au fost de ajutor. Nu ezitați să ne contactați pentru orice întrebare sau dacă aveți nevoie de asistență suplimentară. Vă așteptăm cu drag data viitoare și nu uitați să ne adăugați la favorite!