IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Sudoku, backstracking, récursion inévitable?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    726
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 726
    Par défaut Sudoku, backstracking, récursion inévitable?
    Voilà j'essaye en vain de programmer une fonction C++ qui rempli une grille de sudoku partiellement remplie (il y a 0 dans les cases vides).
    Pour cela je dispose d'un tableau 2d et 1d pour la grille ainsi qu'un tableau de sauvegarde des cases à compléter.
    Je dois écrire la fonction avec le principe du backstracking seulement il apparait indispensable d'utiliser de la récursion et là dessus j'avoue que je ne suis pas très au point.
    Mes questions sont les suivantes:
    -Peut-on programmer la méthode du backstracking sans récursion? Si oui comment?
    -Si non, quelqu'un aurait-il l'algo ou le code c++ de la fonction écrit clairement?
    -Existe-t-il d'autres méthodes aussi efficaces pour compléter une grille de sudoku avec juste quelques cases de remplies?

    merci beaucoup

    méthode du backstracking:
    http://perso.orange.fr/christophe.gu...res/sudoku.xml

  2. #2
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    Citation Envoyé par piotrr
    Voilà j'essaye en vain de programmer une fonction C++ qui rempli une grille de sudoku partiellement remplie (il y a 0 dans les cases vides).
    Pour cela je dispose d'un tableau 2d et 1d pour la grille ainsi qu'un tableau de sauvegarde des cases à compléter.
    Je dois écrire la fonction avec le principe du backstracking seulement il apparait indispensable d'utiliser de la récursion et là dessus j'avoue que je ne suis pas très au point.
    Mes questions sont les suivantes:
    -Peut-on programmer la méthode du backstracking sans récursion? Si oui comment?
    -Si non, quelqu'un aurait-il l'algo ou le code c++ de la fonction écrit clairement?
    -Existe-t-il d'autres méthodes aussi efficaces pour compléter une grille de sudoku avec juste quelques cases de remplies?

    merci beaucoup

    méthode du backstracking:
    http://perso.orange.fr/christophe.gu...res/sudoku.xml
    Deja c'est backtracking et récursivité!
    J'ai programmé un sudoku qui me générait une solution unique, proposait de compter les solutions de la grille et me donner une solution (résolvait)...

    Donc en fait tu veux un solver:
    le backtrack c'est mettre un chiffre et continuer . si ca va pas tu reviens. le mieux c'est de backtracker.

    et pour backtracker le mieux c'est du recursif!

    cependant, moi je l'avais fait autrement.
    tu trouveras facilement des signatures de fonctions recursives avec google.
    et tu pourras aussi trouver un bon nombre incalculable de méthode pour résoudre.

    mais génére, c'est plus drôle ^^

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    726
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 726
    Par défaut argh...
    Si il n'existe pas d'autre façon que la récursivité quelq'un aurait -il l'algo ou le code c++ de la fonction?

    merci... (je ne trouve rien de satisfaisant sur google et cie...)

  4. #4
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    sans parler de complexité:
    - stocker les nombres présents sur la grille (parcourt de la matrice)
    dans une pile (stack).
    - tu rajoutes un chiffre sur ta grille, si il convient, tu mets dans la pile
    - tu choisis une autre case vide et tu la mets dans ta pile si c'est ok.
    - des que ta pile as 1 taille de 81 chiffres c'est fini.
    bien entendu il faut qu'a chaque ajout de chiffre sur ta grille, le chiffre aille bien.

    comme ca si tu n'as plus de possibilité pour une case donnée, tu dépiles et t'essaie un autre chiffre. c'est le principe du backtrack sans récursivité.
    et tu peux stocker tes cases vides dans une pile aussi et dépiler au fur et a mesure que t'empiles.

    J'ai fait un peu comme ca en plus compliqué mais le principe est là. j'ai oublié quelque chose mais quelqu'un saura le rajouter!
    je ne vois que cette solution si tu veux backtracker sans du récursif.

    ou sinon enregistrer chaque état d'une matrice et reprendre l'ancien a chaque fois...
    apres tu optimises ton code en prenant la liste des voisins, etc...

  5. #5
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    par contre faut modifier un peu si tu veux générer une grille avec solution unique... un peu plus compliqué encore mais faisable ^^

    Et quand je dis tu met dans la pile, tu t'arranges pour trouver une structure de données la plus et la plus efficace qui soit.

    si t'as un tab 1D, c'est simple tu stockes le num de la case et la valeur... enfin apres c'est un choix et ca ne fai tpas partie du détail algorithmique

  6. #6
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    si tu veux un algo (et des explications approfondies), j'ai un lien:

    http://www.codeproject.com/useritems/sudoku_solver.asp

    Par contre c'est en Anglais..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Invité de connexion "Adserver" sous FireFox
    Par KibitO dans le forum Administration
    Réponses: 10
    Dernier message: 13/11/2004, 14h19
  2. Eviter d'inviter tous les utilisateurs au groupe root
    Par ggnore dans le forum Administration système
    Réponses: 24
    Dernier message: 21/10/2004, 20h19
  3. [WebMacro] Les crochets s'invitent!
    Par Twofy dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 04/08/2004, 13h22
  4. Passer à l'invite d'ouverture de session...
    Par Leoxp dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 14/12/2003, 20h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo