Partage
  • Partager sur Facebook
  • Partager sur Twitter

carré magique ioi c++

salut a tous

Sujet résolu
    10 août 2021 à 15:54:07

    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";
    }



    • Partager sur Facebook
    • Partager sur Twitter
      10 août 2021 à 17:57:33

      Bonjour,

      Quelle est ta question ?

      Cordialement

      • Partager sur Facebook
      • Partager sur Twitter
        10 août 2021 à 18:11:38

        ce code marche pour 16 des 21t tests et affiche "yes" au lieu de "no"
        • Partager sur Facebook
        • Partager sur Twitter
          10 août 2021 à 18:56:55

          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];
          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

          carré magique ioi c++

          × 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.
          • Editeur
          • Markdown