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

Collection et Stream Java Discussion :

Génération tableau sudoku


Sujet :

Collection et Stream Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Points : 12
    Points
    12
    Par défaut Génération tableau sudoku
    Bonjour
    Voila je suis en train de créer un sudoku. Plus précisement, je veux générer une solution dans un tableau 9x9.
    Donc je parcours mon tableau[9][9], et je génère des chiffres aléatoires de 1 à 9, vérifiant s'ils sont déjà sur la même ligne , même colonne et même bloc.(la fonction qui vérifie si le chiffre existe déjà est constituée de 3 boucles, qui regardent la ligne , la colonne et le bloc qui contienent la case à traiter.

    Sauf que voilà a l'execution, j'ai une boucle infinie. En effet, lorsque je mets la partie vérification d'un bloc et de colonne en commentaire, je crée un sudoku dont les chiffres vérifient juste l'unicité des chiffres des lignes.
    Voici mon code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    public static void initGame() {
            ResolutionTableau[0][0] = (int) (Math.random() * 9 + 1);
            int coin = ResolutionTableau[0][0];
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    if (i != 0 || j != 0) {
                        while (verifyIfNumberAlreadyExist(i, j, ResolutionTableau, coin)) {
                            boolean stretch = false;
                            if (stretch == false) {
                                coin = (int) (Math.random() * 9 + 1);
                                System.out.println("coin " + coin);
                            } else {
                                coin = (coin + 1) % 10;
                            }
                            // System.out.println("case " + i + " ligne et " + j + "colonne");
                            System.out.println("Resolution " + ResolutionTableau[i][j]);
                            System.out.println("Resolution " + i + " and" + j);
                            stretch = true;
                        }
                        ResolutionTableau[i][j] = coin;
                    }
                }
            }
        }
        public static boolean verifyIfNumberAlreadyExist(int i, int j, int[][] tableau, int numeroaverifier) {
            boolean result = false;
            //On vérifie sur cette boucle si le chiffre existe déjà sur la même ligne
           /* if (j > 0) {
                for (int l = 0; l < j; l++) {
                    if (numeroaverifier == tableau[i][l]) {
                        result = true;
                        // System.out.println(+numeroaverifier);
                        System.out.println(result + " meme ligne avec " + i + " colonne" + l + "avec comme valeur " + tableau[i][l]);
                        return result;
                    }
                }
            }
            /*if (i > 0) {
                for (int k = 0; k < i; k++) {
                    if (numeroaverifier == tableau[k][j]) {
                        result = true;
                        System.out.println(result + " meme ligne avec " + i + " colonne" + "avec comme valeur ");
                        return result;
                    }
                }
            }*/   if (i % 3 != 0 || j % 3 != 0) {
                for (int l = i - i % 3; l < i -i%3+3; l++) {
                    for (int k = j - j % 3; k < j -j%3+3; k++) {
                        if (i != l || j != k) {
                            if (numeroaverifier == tableau[l][k] && tableau[l][k] != 0) {
                                result = true;
                                System.out.println(result +" et meme carre");
                                return result;
                            }
                        }
                    }
                }
            }
            return result;
        }

    Merci

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Points : 2 657
    Points
    2 657
    Par défaut
    Déjà repère avec des traces sur quel boucle tu as une exécution infini.
    Ensuite il te restera juste à vérifier si c'est ta condition d'arret qui est fausse, ou le traitement dans la boucle.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    en faite chaque boucle à part fonctionne parfaitement, il suffit que j'active deux boucles pour que sa tourne en infini.
    J'ai déjà fait des println, je remarque qu'aléatoirement (pour un i et j ), la boucle dans initGame() tourne en infini ...

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 33
    Points : 50
    Points
    50
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while (verifyIfNumberAlreadyExist(i, j, ResolutionTableau, coin)) {
                            boolean stretch = false;
                            if (stretch == false) {
                                coin = (int) (Math.random() * 9 + 1);
                                System.out.println("coin " + coin);
                            } else {
                                coin = (coin + 1) % 10;
                            }
                            // System.out.println("case " + i + " ligne et " + j + "colonne");
                            System.out.println("Resolution " + ResolutionTableau[i][j]);
                            System.out.println("Resolution " + i + " and" + j);
                            stretch = true;
                        }
    Bonjour,
    Je remarque que dans cette boucle while (où tu fais l'appel à ta fonction verifyIfNumberAlreadyExist), ton i et ton j ne sont pas modifiés, du coup l'appel est répété avec les mêmes coordonnées. Mais je ne m'avance pas plus, je n'ai pas été plus loin dans le code.

  5. #5
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Points : 2 657
    Points
    2 657
    Par défaut
    Tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     boolean stretch = false;
                            if (stretch == false) {
                                coin = (int) (Math.random() * 9 + 1);
                                System.out.println("coin " + coin);
                            } else {
                                coin = (coin + 1) % 10;
                            }
    Ton stretch est donc toujours a false... Il faut surement l'initialiser avant le while.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par deathness Voir le message
    Tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     boolean stretch = false;
                            if (stretch == false) {
                                coin = (int) (Math.random() * 9 + 1);
                                System.out.println("coin " + coin);
                            } else {
                                coin = (coin + 1) % 10;
                            }
    Ton stretch est donc toujours a false... Il faut surement l'initialiser avant le while.
    Merci, mais ça ne marche pas non plus ... voici la classe en entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public final class Fenetre extends JFrame {
     
        static int[][] ResolutionTableau = new int[9][9];
     
        public static void main(String[] args) {
            int[][] tab={{1,2,3,4,5,6,7,8,9},{4,5,6,7,8,9,1,2,3},{7,8,9,1,2,3,4,5,6},{2,3,4,5,6,7,8,9,1},{5,6,7,8,9,1,2,3,4},{8,9,1,2,3,4,5,6,7},{3,4,5,6,7,8,9,1,2},{6,7,8,9,1,2,3,4,5},{9,1,2,3,4,5,6,7,8}};
            verifyIfNumberAlreadyExist(1, 1, tab, 3);
            //initGame();
            Fenetre fen = new Fenetre();
     
        }
        private JPanel pan = new JPanel();
        private JButton bouton = new JButton();
     
        public Fenetre() {
     
            this.setTitle("Sudoku 1.0");
            this.setSize(500, 500);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLocationRelativeTo(null);
            this.setContentPane(pan);
            initGraphics();
            this.setVisible(true);
        }
     
        public void initGraphics() {
             int[][] tab={{1,2,3,4,5,6,7,8,9},{4,5,6,7,8,9,1,2,3},{7,8,9,1,2,3,4,5,6},{2,3,4,5,6,7,8,9,1},{5,6,7,8,9,1,2,3,4},{8,9,1,2,3,4,5,6,7},{3,4,5,6,7,8,9,1,2},{6,7,8,9,1,2,3,4,5},{9,1,2,3,4,5,6,7,8}};
            JButton[][] tabJButton = new JButton[9][9];
            JPanel jpanel = new JPanel();
            //Variable qui détermine le nombres de chiffres-solutions à afficher depuis le départ
            int numchiffresolution = 27;
            int x = 300;
            int y = 300;
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    tabJButton[i][j] = new JButton();
                    tabJButton[i][j].setSize(20, 30);
                    pan.add(tabJButton[i][j]);
                    tabJButton[i][j].setVisible(true);
                    tabJButton[i][j].setLocation(x, y);
                    //if ((int) (Math.random() * 3) == 2 && numchiffresolution > 0) {
                    tabJButton[i][j].setText(String.valueOf(tab[i][j]));
                    //numchiffresolution--;
                    //}
                    this.getContentPane().add(tabJButton[i][j]);
                    x += 30;
                }
                y = y + 20;
            }
        }
     
        public static void initGame() {
            ResolutionTableau[0][0] = (int) (Math.random() * 9 + 1);
            int coin = ResolutionTableau[0][0];
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9;) {
                    if (i != 0 || j != 0) {
                        while (verifyIfNumberAlreadyExist(i, j, ResolutionTableau, coin)) {
                            coin = (int) (Math.random() * 9 + 1);
                            System.out.println("coin " + coin);
                            coin = (coin + 1) % 10;
                    }
                    ResolutionTableau[i][j] = coin;
                }j++;
            }i++;
        }
    }
    public static boolean verifyIfNumberAlreadyExist(int i, int j, int[][] tableau, int numeroaverifier) {
            boolean result = false;
            //On vérifie sur cette boucle si le chiffre existe déjà sur la même ligne
           if (j > 0) {
                for (int l = 0; l <9; l++) {
                    if(l>=j){break;}
                    if (numeroaverifier == tableau[i][l]) {
                        result = true;
                        // System.out.println(+numeroaverifier);
                       System.out.println("ligne avec i=" +i +" et j=" +j +" et l="+l);
                        return result;
                    }
                }
            }
            if (i > 0) {
                for (int k = 0; k < 9; k++) {
                    if(k>=i){break;}
                    if (numeroaverifier == tableau[k][j]) {
                        result = true;
                        System.out.println("colonne avec i=" +i +" et j=" +j +" et k="+k);
                        return result;
                    }
                }
            } if (i % 3 != 0 || j % 3 != 0) {
                for (int l = i - i % 3; l < i -i%3+3; l++) {
                    for (int k = j - j % 3; k < j -j%3+3; k++) {
                        if (i != l || j != k) {
                            if (numeroaverifier == tableau[l][k] && tableau[l][k] != 0) {
                                result = true;
                               System.out.println("carre avec i=" +i +" et j=" +j +" et l="+l +" et k=" +k);
                                return result;
                            }
                        }
                    }
                }
            }
            return result;
        }
    }
    C'est la seule classe du projet. Notez que là je fais des tests de la fonction verifyIfNumberAlreadyExist . Apparement cette fonction foire, mais je vois pas comment :'(

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 33
    Points : 50
    Points
    50
    Par défaut
    Je redis ce que j'ai dit plus haut.

    Dans ton while tu ne changes pas i et j.
    En conséquence, si tu appelles ta fonction et que celle-ci renvoie true, tu vas toujours rester dans le while.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Oui , en effet, si verifyIfNumberAlreadyExist() renvoie true c'est que la valeur numeroaverifier existe déjà sur la ligne i, sur la colonne j ou sur le bloc contenant [i][j]. Du coup il est normal que dans ce cas je retente avec un autre chiffre numeroaverifier (entre 1 et 9 ) et voir s'il est possible qu'il soit mis dans la case [i][j].

  9. #9
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Points : 134
    Points
    134
    Par défaut
    Es-tu sur que c'est une boucle infinie et pas simplement le nombre d'opération qui est trop important?

    Par exemple :

    1 case de vide = 9 possibilité
    2 cases de vide = 9² possibilité soit 81
    3 cases de vide = 9^3 possibilité soit 729

    20 cases vides : 9^20 soit 12157665459056928801 possibilités


    Je n'ai pas lu ton code, mais il est fort possible que ce ne soit qu'une 'impression' de boucle infinie.

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 33
    Points : 50
    Points
    50
    Par défaut
    Bon j'ai fait quelques tests.

    Déjà premier problème :

    le nombre que tu rentres dans la grille peut valoir 0, ça vient de cette ligne là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    coin = (coin + 1) % 10;
    En effet, si le nombre généré vaut 9, que tu lui ajoutes 1, ça fait 10. Et 10%10 = 0.

    Après si ça peut mettre sur la piste quelqu'un, la boucle infinie a lieu chez moi au bout de 16 nombres rentrés dans la grille.

    EDIT : en supprimant la ligne que j'ai mis, je suis arrivé au bout une fois en affichant la fenêtre... maintenant quand je run ça plante quand il reste 2 cases ou 1 à remplir. Peut-être un problème de perf, sachant que quand je run je suis à 100% d'UC...

    EDIT 2 : Il y a aussi un problème au niveau de la boucle, déjà tu n'incrémentes pas ton j dans la boucle for, je ne comprends pas pourquoi, ensuite tu faisais un i++, à la fin de la boucle for pour le j, donc le problème ne regardait que pour les i pairs.
    J'ai modifié, il regarde maintenant les i impairs et se bloque du coup à la moitié des cases d'où j'allais avant, je continue donc de penser à un problème de performance.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Proxy Voir le message
    Es-tu sur que c'est une boucle infinie et pas simplement le nombre d'opération qui est trop important?

    Par exemple :

    1 case de vide = 9 possibilité
    2 cases de vide = 9² possibilité soit 81
    3 cases de vide = 9^3 possibilité soit 729

    20 cases vides : 9^20 soit 12157665459056928801 possibilités


    Je n'ai pas lu ton code, mais il est fort possible que ce ne soit qu'une 'impression' de boucle infinie.
    Non, la preuve quand je debug, je remarque qu'il plante sur des valeurs (i,j) (chaque lancemen des valeurs différentes).
    Et je ne teste tout à la fois, donc pour 2 cases ça fait plutot 9x2 et pour 20 cases ça fait à l'ordre de 9x20=180.

  12. #12
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 33
    Points : 50
    Points
    50
    Par défaut
    Voici ce que j'obtiens en sortie lors de mes tests si ça peut t'aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    num placé, case : 0,1 avec : 2
    num placé, case : 0,2 avec : 3
    num placé, case : 0,3 avec : 5
    num placé, case : 0,4 avec : 6
    num placé, case : 0,5 avec : 1
    num placé, case : 0,6 avec : 7
    num placé, case : 0,7 avec : 8
    num placé, case : 0,8 avec : 9
    num placé, case : 1,0 avec : 9
    num placé, case : 1,1 avec : 5
    num placé, case : 1,2 avec : 6
    num placé, case : 1,3 avec : 7
    num placé, case : 1,4 avec : 8
    num placé, case : 1,5 avec : 2
    num placé, case : 1,6 avec : 3
    num placé, case : 1,7 avec : 4
    num placé, case : 1,8 avec : 1
    num placé, case : 2,0 avec : 1
    num placé, case : 2,1 avec : 7
    num placé, case : 2,2 avec : 8
    num placé, case : 2,3 avec : 4
    num placé, case : 2,4 avec : 9
    num placé, case : 2,5 avec : 3
    num placé, case : 2,6 avec : 6
    num placé, case : 2,7 avec : 5
    num placé, case : 2,8 avec : 2
    num placé, case : 3,0 avec : 2
    num placé, case : 3,1 avec : 3
    num placé, case : 3,2 avec : 9
    num placé, case : 3,3 avec : 6
    num placé, case : 3,4 avec : 4
    num placé, case : 3,5 avec : 7
    num placé, case : 3,6 avec : 5
    num placé, case : 3,7 avec : 1
    num placé, case : 3,8 avec : 8
    num placé, case : 4,0 avec : 8
    num placé, case : 4,1 avec : 6
    num placé, case : 4,2 avec : 5
    num placé, case : 4,3 avec : 3
    num placé, case : 4,4 avec : 1
    num placé, case : 4,5 avec : 9
    num placé, case : 4,6 avec : 4
    num placé, case : 4,7 avec : 7
    et après ça plante...

    EDIT : Je viens de refaire un test, j'obtiens cette sortie là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    num placé, case : 0,1 avec : 1
    num placé, case : 0,2 avec : 8
    num placé, case : 0,3 avec : 3
    num placé, case : 0,4 avec : 9
    num placé, case : 0,5 avec : 2
    num placé, case : 0,6 avec : 5
    num placé, case : 0,7 avec : 4
    num placé, case : 0,8 avec : 7
    num placé, case : 1,0 avec : 7
    num placé, case : 1,1 avec : 4
    num placé, case : 1,2 avec : 2
    num placé, case : 1,3 avec : 1
    num placé, case : 1,4 avec : 5
    num placé, case : 1,5 avec : 8
    num placé, case : 1,6 avec : 3
    num placé, case : 1,7 avec : 9
    num placé, case : 1,8 avec : 6
    num placé, case : 2,0 avec : 3
    num placé, case : 2,1 avec : 5
    num placé, case : 2,2 avec : 9
    num placé, case : 2,3 avec : 7
    num placé, case : 2,4 avec : 4
    num placé, case : 2,5 avec : 6
    num placé, case : 2,6 avec : 8
    num placé, case : 2,7 avec : 1
    num placé, case : 2,8 avec : 2
    num placé, case : 3,0 avec : 2
    num placé, case : 3,1 avec : 8
    num placé, case : 3,2 avec : 7
    num placé, case : 3,3 avec : 5
    num placé, case : 3,4 avec : 6
    num placé, case : 3,5 avec : 3
    num placé, case : 3,6 avec : 9
    Je l'ai ensuite fait sur papier pour voir pourquoi ça plantait, voici ce que ça donne :

    6 | 1 | 8 || 3 | 9 | 2 || 5 | 4 | 7
    7 | 4 | 2 || 1 | 5 | 8 || 3 | 9 | 6
    3 | 5 | 9 || 7 | 4 | 6 || 8 | 1 | 2
    2 | 8 | 7 || 5 | 6 | 3 || 9 | ? | ?

    On voit bien que la première case avec le point d'interrogation ne peut pas être résolue. En effet, les deux seuls chiffres que l'on peut mettre dans la ligne sont le 1 et le 4 qui se trouvent sur la colonne que l'on essaie de remplir... Il y a un problème dans ton algo.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Ok je vois. Dans ce cas plutot il faut que je commence par être sur que le sudoku soit résoluble. Dans ce cas comment je fais pour être sur que j'aurai une solution ?
    J'ai comme idée de créer un début de sudoku solvable et de le résoudre. Quel sera donc le nombre de case et l'endroit qui auront dès le début un chiffre?

  14. #14
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 33
    Points : 50
    Points
    50
    Par défaut
    Renseigne toi sur le backtraking.

    Tiens : Voilà quelque chose qui devrait t'aider, il y a même une implémentation : http://www.developpez.net/forums/d63...-backtracking/

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Adpar Voir le message
    Renseigne toi sur le backtraking.

    Tiens : Voilà quelque chose qui devrait t'aider, il y a même une implémentation : http://www.developpez.net/forums/d63...-backtracking/
    Merci pour cette réponse. En effet, j'y avait pensé avant mais vu que pour créer un jeu sudoku faut que je crée une grille avec quelque valeurs remplis dessus. C'est là où je me suis planté: je ne sais pas comment je pourrais générer une grille avec qq valeurs dessus pour ensuite utiliser le backtracking.
    Et c'est ainsi que j'avais décidé de remplir un tableau au début... et vous connaissez la suite .

  16. #16
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 33
    Points : 50
    Points
    50
    Par défaut
    Avec du backtracking une grille vide est soluble "algorithmiquement" parlant

    Après, une fois qu'elle est réalisée, tu copies le tableau, tu lui retires certaines cases et c'est bon.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    et si je mettais 2 ou 3 cases aléatoirement dans des endroits différents et j'appliquais le backtracking?? merci

  18. #18
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2012
    Messages : 33
    Points : 50
    Points
    50
    Par défaut
    Ca se fait...
    Et dans le pire des cas si tu y vas bourrin, au bout d'un moment tu te rends comptes que l'algo n'a plus de solution pour terminer la grille (facile à faire), et tu recommences en replaçant aléatoirement 2-3 cases.

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

Discussions similaires

  1. XSL-FO génération tableau
    Par lenstoi dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 24/09/2008, 12h43
  2. Réponses: 5
    Dernier message: 15/02/2007, 16h47
  3. probleme d'affichage d'un tableau sudoku
    Par masterix59 dans le forum C
    Réponses: 2
    Dernier message: 05/12/2006, 00h04
  4. Tentative de génération d'un tableau type "sudoku"
    Par charlybapt dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 06/04/2006, 09h48
  5. Génération d'une hash de hash de tableau
    Par antigone dans le forum Langage
    Réponses: 3
    Dernier message: 01/09/2005, 19h18

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