j'ai voulu faire qulques exercies de france ioi, mais je me trouve bloque devant le carré magique.
Pour rappel :
"Un carré magique est une grille carrée dans laquelle des nombres sont placés de telle sorte que la somme des nombres de chaque colonne, chaque ligne et de chacune des deux diagonales soit la même. De plus, Le carré doit contenir une fois chaque nombre, de 1 au nombre de cases de la grille."
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
int mat[n][n];
unordered_map<int, int>mp;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
cin>>mat[i][j];
mp[mat[i][j] - 1]++;
}
}
for(auto i:mp) {
if(i.second != 1) {
cout<<"no\n";
return 0;
}
}
int sumFirst = 0;
for(int i = 0;i < n; i++) sumFirst += mat[i][i];
// calculate the sum of each row
for(int i = 0; i < n; i++) {
int sum = 0;
for(int j = 0; j < n; j++)
sum += mat[i][j];
if(sum != sumFirst) {
cout<<"no\n";
return 0;
}
}
// end calculate sum
// start calculate sum of each column
for(int i = 0; i < n; i++) {
int sum = 0;
for(int j = 0; j < n; j++)
sum += mat[j][i];
if(sum != sumFirst) {
cout<<"no\n";
return 0;
}
}
// end calculate
// start calculate the sum of second diagonal
int sum = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(i + j == n - 1)
sum += mat[i][j];
}
}
if(sum != sumFirst) {
cout<<"no\n";
return 0;
}
// end calculate
cout<<"yes\n";
}
Fais-tu les deux diagonales? Pour la première, une seule boucle suffit: for(int i=0; i<n; i++) sum += mat[i][i]; Pour la seconde: for(int i=0; i<n; i++) sum += mat[n-i-1][i];
Le Tout est souvent plus grand que la somme de ses parties.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.