Carré Magique c++
Répondre à la discussion
Affichage des résultats 1 à 22 sur 22

Carré Magique c++



  1. #1
    defender19

    Carré Magique c++


    ------

    Bonjour!

    Je cherche à résoudre un exo d'algo en c++, voici l'énoncé ;

     Cliquez pour afficher


    J'ai fait ce code qui marche bien, seulement, les tests du code par le serveur (site France IOI) me refuse 4 tests car mon programme, il semblerait, est trop gourmand en mémoire.

    Code:
    #include <iostream>
    
    using namespace std;
    
    
    int main(){
        int nb;
        cin>>nb;
        if(nb<1 || nb>20)
            return 0;
    
        int tab[nb][nb], sommel=0, sommeTl=0, sommec=0, sommeTc=0, sommeD=0, sommeD1=0;
    
        for(int i=0; i<nb; i++){
            for(int j=0; j<nb; j++){
                cin>>tab[i][j];
                sommel+=tab[i][j];
            }
            if(i==0)
                sommeTl=sommel;
            if(sommel!=sommeTl){
                cout<<"no";
                return 0;
            }
            sommel=0;
        }
    
        int nombre[9]={0};
    
    
        for(int i=0, k=nb-1; i<nb; i++, k--){
            sommeD+=tab[i][i];
            sommeD1+=tab[k][k];
            for(int j=0; j<nb; j++){
                nombre[tab[i][j]-1]++;
                sommec+=tab[j][i];
            }
            if(i==0)
                sommeTc=sommec;
            if(sommec!=sommeTc){
                cout<<"no";
                return 0;
            }
            sommec=0;
        }
        
        if(sommeTc!=sommeTl || sommeD!=sommeD1 || sommeD!=sommeTc){
            cout<<"no";
            return 0;
        } 
    
        for(int i=0; i<9; i++){
           if(nombre[i]!=1){
                cout<<"no";
                return 0;
           }
        }
    
        cout<<"yes";
    
        return 0;
    }
    Si quelqu'un a une idée pour aborder le sujet différemment ou pour diminuer la mémoire utilisée!

    Exemple d'une erreur qu'il me met 4 fois la même :

    Votre programme a échoué à la suite d'un accès mémoire en dehors des zones réservées, ou d'un dépassement de la limite de mémoire.
    Votre programme s'est terminé à la suite d'une erreur. Cela peut venir d'une des raisons suivantes :
    Votre programme a dépassé la limite de mémoire autorisée pour ce problème, que ce soit sous la forme de variables statiques, d'allocations dynamiques, ou bien de la pile.
    Votre programme a tenté de faire un accès mémoire en dehors des zones allouées.
    Je pense aussi que ma méthode pour tester s'il y a à chaque fois qu'une seule fois un chiffre est pas bonne!

    -----

  2. #2
    invite4492c379

    Re : Carré Magique c++

    Hello,

    j'ai lu le code en diagonale et je dirais que tu déclares
    int nombre[9]={0};

    puis je vois :
    nombre[tab[i][j]-1]++;

    sachant qu'a priori on a 1<tab[i][j]<nb² pour tout i,j , je me dis que tôt ou tard tu vas exploser ton tableau nombre.

  3. #3
    defender19

    Re : Carré Magique c++

    Oui, je me demande si les erreurs ne sont pas du à ça justement et pas à un problème de mémoire (par rapport aux contraintes demandées).

    Du coup, il faudrait que je déclare en fonction des dimensions du tableau avec un int nombre[nb*nb]={0} ?

  4. #4
    defender19

    Re : Carré Magique c++

    Edit impossible!

    Il veut bien pas me prendre ça du coup :

    int taille=nb*nb;
    int nombre[taille]={0};

    mais sans l'initialiser à 0, il prends...

  5. A voir en vidéo sur Futura
  6. #5
    invite4492c379

    Re : Carré Magique c++

    Je t'assure que le pb vient de là

    Je suppose que le tableau nombre sert à vérifier que chaque nombre apparaît une et une seule fois ... alors oui int nombre[nb*nb+1]; me semble pas trop mal (le ={0} initialise-t-il toutes les cellules à 0 ?).

    Je n'ai pas essayé de comprendre ton programme, je pourrais prendre un peu plus de temps un peu plus tard dans la soirée.

  7. #6
    defender19

    Re : Carré Magique c++

    C'est bien ça, ce passage du code vérifie que le nombre n'est qu'une fois dans la grille.

    Le ={0} mets théoriquement à 0, puisque ça ne marche pas là (mon message précédent).

    Merci pour ces infos

  8. #7
    defender19

    Re : Carré Magique c++

    Bon bah j'ai fais une petite boucle pour initialiser à 0, et tout à marché!

    Tous les test réussi, c'était donc bien l'erreur du tableau!

    Merci bien

  9. #8
    invite4492c379

    Re : Carré Magique c++

    Well done Sheldon

  10. #9
    lucas.gautheron

    Re : Carré Magique c++

    Il me semble qu'en C, il n'est pas garanti qu'une déclaration du type :
    Code:
    int var = n;
    int array[var];
    soit tolérée par le compilo.
    J'ai même lu qu'il était préférable dans ce cas, d'allouer la mémoire sur le tas (malloc) malgré le problème des fuites de mémoire
    c'est à dire :
    Code:
    int var = n;
    int array = malloc(var * sizeof(int));
    EDIT : euh ? j'avais pas vu mais c'est censé être du c++... n'y aurait-il pas un petit problème?
    Dernière modification par lucas.gautheron ; 04/01/2012 à 20h12.

  11. #10
    invite4492c379

    Re : Carré Magique c++

    Citation Envoyé par lucas.gautheron Voir le message
    Il me semble qu'en C, il n'est pas garanti qu'une déclaration du type :
    Code:
    int var = n;
    int array[var];
    soit tolérée par le compilo.
    J'ai même lu qu'il était préférable dans ce cas, d'allouer la mémoire sur le tas (malloc) malgré le problème des fuites de mémoire
    c'est à dire :
    Code:
    int var = n;
    int array = malloc(var * sizeof(int));
    En C c'est autorisé depuis la norme C99 (mais limité, ne peut ni être static ni extern). Je ne peux que recommander valgrind pour s'assurer (en plus de la rigueur nécessaire à ce genre d'allocation dynamique) que les fuites mémoires sont maitrisées.

  12. #11
    lucas.gautheron

    Re : Carré Magique c++

    ok.
    en revanche en c++ c'est interdit on est d'accord?
    pour moi ce qu'a fait defender19 c'est du c, pas du c++ ?!

  13. #12
    invite4492c379

    Re : Carré Magique c++

    Non, c'est autorisé en c++ le langage utilisé par defender19 (dans le titre : carré magique c++).

    Maintenant il suffit d'essayer un code comme :

    Code:
    #include <iostream>
    
    
    using namespace std;
    
    
    
    
    int main(){
      int n;
      cout << "n=";
      cin >> n;
      int tab[n];
      cout << sizeof(tab)/sizeof(int) << endl;
    }
    Cela dépend peut-être du compilo ... je me renseigne (j'utilise gcc).

  14. #13
    defender19

    Re : Carré Magique c++

    Je sais pas, mais en C comme en C++, j'ai l'habitude de faire comme ça sans problème pour des tableaux statiques.

  15. #14
    invite4492c379

    Re : Carré Magique c++

    Pour info, la norme C++ (y compris C11) n'autorise pas un code comme celui que j'ai posté en #12. g++ le supporte comme une extension (issue de C99). La compilation avec l'option -pedantic génère un warning.
    warning: ISO C++ forbids variable length array

  16. #15
    lucas.gautheron

    Re : Carré Magique c++

    plante aussi avec le compilateur de vcpp.

    @defender: on parle de tableaux dynamiques

  17. #16
    invite4492c379

    Re : Carré Magique c++

    Dans la norme c99 il s'agit bien d'une allocation dynamique mais sur la pile et non le tas, c'est pourquoi il est interdit de le déclarer en static.

  18. #17
    defender19

    Re : Carré Magique c++

    Et au final, ce que j'ai fait c'est correct ou non? Parce que votre charabiat, j'y comprends pas encore quelque chose!

  19. #18
    invite4492c379

    Re : Carré Magique c++

    Ton code ce n'est ni du C ni du C++ mais un mélange des deux. Pas forcément académique (ne compilera pas sous toutes les architectures), dangereux dans le sens où tu peux facilement faire exploser la pile.
    Un allocation dyname sur le tas est faite via new[], ce qui serait un peu plus robuste.

  20. #19
    defender19

    Re : Carré Magique c++

    Oui mais au final mon tableau n'est pas dynamique, il prend juste la taille nb² durant tout le programme, il est initialisé au début.

  21. #20
    invite4492c379

    Re : Carré Magique c++

    Il y a en gros deux endroits où les variables sont stockées : la pile (stack) et le tas (heap). La pile est d'une taille faible et est utilisée pour stocker les paramètres d'appel de fonction, les appels de fonctions (savoir où on revient après l'appel), les variables locales. Le tas c'est là où sont stockée les données allouées dynamiquement. Il n'est pas bon de créer de grosses variables locales (tableaux volumineux ou grandes structures/classes) car la place sur la pile est limitée. C'est pourquoi on préfère l'allocation dynamique sur le tas (malloc, new, ...).
    Dans ton code, le tableau n'est pas alloué du tout avant la ligne où tu le déclares, à ce moment là de la place est faite sur la pile (au pire dans les 1600 octets pour 400 int 32 bit). Si tu avais du utiliser un tableau plus grand tu aurais pu avoir un stack overflow (exploser la pile).

  22. #21
    defender19

    Re : Carré Magique c++

    Ok ok, merci de bien de l'explication ! Après pour les besoins de l'exo, nb devait être <= à 20, donc max 400 cases, mais je retiens, merci
    Dernière modification par defender19 ; 05/01/2012 à 19h04.

  23. #22
    hammadiashraf

    Re : Carré Magique c++

    Bonjour à tous, je ne suis pas informaticien,mais j'ai des connaîssances en informatique. Je voulais juste savoir si le programme cité consisterait à obtenir d'autres carrés magiques de dimension 2n+1 avec n entier naturel >0 ; car pour ma part je dispose d'une methode permettant à l'aide d'une grille et un crayon d'obtenir facilement des carrés magiques à n'importe quelle dimension impaire.
    The wall

Discussions similaires

  1. Carré magique
    Par invite852eda79 dans le forum Mathématiques du collège et du lycée
    Réponses: 2
    Dernier message: 11/09/2011, 18h49
  2. carre magique
    Par invite47f59165 dans le forum Mathématiques du supérieur
    Réponses: 0
    Dernier message: 10/12/2010, 17h44
  3. carré magique
    Par Evil.Saien dans le forum Science ludique : la science en s'amusant
    Réponses: 12
    Dernier message: 17/09/2010, 14h30
  4. Carré magique
    Par invite06020107 dans le forum Science ludique : la science en s'amusant
    Réponses: 21
    Dernier message: 08/10/2009, 19h29
  5. le carré magique!
    Par invite55b631a0 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 01/10/2005, 14h48