Règles de Sudoku
Dans les jeux de Sudoku, la grille classique de neuf cage composée de 9 × 9 = 81 cellules, et forme également 3 × 3 = 9 petites grilles de neuf cage. Il est nécessaire de remplir les nombres 1 à 9 dans 81 petites cellules, et les nombres ne peuvent pas être répétés dans chaque rangée, colonne et chaque petite grille de neuf cage.
Compétences Sudoku
Mes pensées
Conception et implémentation de la solution
Seul un tableau bidimensionnel est utilisé pour stocker le schéma Sudoku, un tableau unidimensionnel est utilisé comme pile, et une variable booléenne est utilisée comme identification de retour en arrière.
1. Définition variable:
Var Problem = [// C'est la question de la difficulté 10.7 mentionnée dans le livre [8,0,0,0,0,0,0,0,0], [0,0,3,6,0,0,0,0,0,0], [0,7,0,0,9,0,2,0,0], [0,5,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,4,5,7,0,0,0], [0,0,0,1,0,0,0,0,0,3,0], [0,0,1,0,0,0,0,0,0,6,8], [0,0,8,5,0,0,0,0,1,0,0,0,0,] = [], drapeau = false;
2. Détermination de l'efficacité du plan:
La fonction de hachage des objets JavaScript est entièrement utilisée. Afin de faciliter le débogage, la valeur de retour de la fonction est 0 lorsqu'elle est valide, et il y a trois situations où il est invalide: conflit de lignes, conflit de colonnes et conflit de grille à neuf parties, qui retournent 1, 2 et 3 respectivement. Je l'ai utilisé dans le jugement précoce et j'ai ajouté plus tard le jugement pertinent de vingt trames. Cette fonction n'est plus utilisée lors de la recherche de la réponse.
Fonction CheckValid (sudo) {let subsudo = {} // variable auxiliaire utilisée pour déterminer si la neuvième grille est confrontée à (que i = 0; i <9; i ++) {let row = {}, col = {} // variable auxiliaire utilisée pour déterminer si les lignes et les colonnes sont confrontés à (que j = 0; j <9; j ++) sudo [i] [j], cur2 = sudo [j] [i] // Variable autorisée terminée du jugement de ligne et de colonne en même temps si (ligne [cur1]) // L'élément actuel est apparu dans la ligne, et le jugement de zéro est optimisé. Lorsque la clé est 0, la valeur est 0, aucun jugement supplémentaire n'est requis. Retour 1; // Retour Code d'erreur Else Row [Cur1] = Cur1 // L'élément actuel n'apparaît pas dans la ligne et est stocké dans la variable auxiliaire if (Col [Cur2]) // Le jugement de la colonne est similaire à la ligne. Le jugement de zéro est optimisé. Lorsque la clé est 0, la valeur est 0 et il n'y a pas besoin de jugement supplémentaire. Retour 2; else col [cur2] = cur2; Soit key = math.floor (i / 3) + '-' + math.floor (j / 3) // Les différentes clés sont générées pour différentes réseaux de neuf cliens si (subdoo [key]) {// Le jugement de zéro est déjà là, et le jugement de zéro est optimisée. Lorsque la clé est 0, la valeur est 0, et il n'y a pas besoin de jugement supplémentaire si (subdo [clé] [cur1]) // Le jugement d'une grille de neuf cliges est similaire à celui de la ligne renvoie 3 else subdoon [clé] [cur1] = cur1} else else grille et enregistrer le premier élément dans la subsudo [key] [cur1] = cur1}}} return 0; // Le programme peut exécuter cela, indiquant que le plan est valide} 3. Détermination pertinente de vingt catégories Le principe est le même que le jugement global, et le point culminant réside dans le positionnement de la petite grille de neuf cages. Fonction Check20grid (sudo, i, j) {let row = {}, col = {}, subdoo = {} // fournir une variable pour (let k = 0; k <9; k ++) {let cur1 = sudo [i] [k], cur2 = sudo [k] [j] if (cur1) {// L'élément actuel a apparu dans la ligne, et le jugement de zéro est. Lorsque la clé est 0, la valeur est 0 et il n'y a pas besoin de jugement supplémentaire si (ligne [Cur1]) renvoie 1; // Retour Code d'erreur Else Row [Cur1] = Cur1 // L'élément actuel n'apparaît pas dans la ligne et est stocké dans la variable auxiliaire} if (cur2) {// Le jugement de la colonne est similaire à la ligne. Le jugement de la perte zéro est optimisé. La valeur est 0 lorsque la clé est 0. Il n'y a pas besoin de jugement supplémentaire si (col [cur2]) renvoie 2; else col [cur2] = cur2; } // Les coordonnées de la variable de boucle de conversion en neuvième grille let key = sudo [math.floor (i / 3) * 3 + math.floor (k / 3)] [math.floor (j / 3) * 3 + math.floor (k% 3)] if (subdo [key]) // Le jugement du nintième réseau est similaire à la ligne. Le jugement de la perte zéro est optimisé. La valeur est 0 lorsque la clé est 0.4. Solution de traversée
L'utilisation d'éléments avec une valeur initiale de zéro dans l'état d'élément est une fonctionnalité en attente, et avec l'aide de la pile, aucun espace de stockage supplémentaire n'est ouvert.
Fonction Findanswer () {for (Soit i = 0; i <9; i ++) {for (Soit j = 0; j <9;) {if (problème [i] [j] === 0 || drapeau) {// La position actuelle est le premier traitement de l'élément à déterminer ou à la position actuelle. Les deux situations semblent différentes, mais en fait, le traitement est le même. Ajoutez 1 par vous-même drapeau = false; Soit k = problème [i] [j] + 1; // Recherchez pour passer à la valeur juridique suivante tandis que (k <10) {// boucle pour trouver le prochain problème de valeur juridique [i] [j] = k; // remplit if (check20grid (problème, i, j) == 0) {// par défaut est légal, et le jugement pertinent de vingt images est pile.push ([i, j ++]) // stockage le point de trace et passez en pause; } k ++; } if (k> 9) {// La valeur juridique ne peut être trouvée à la position actuelle, le problème de trace [i] [j] = 0; // retourne avant le traceback let rt = stack.pop (); // Récupérez les informations de trace dans la pile si (! Rt) // Aucun jugement de solution, retour 0 return 0; i = rt [0] // voyage j = rt [1] drapeau = true; }} else {// Le numéro de position actuel est donné J ++; }}} return 1; // a trouvé avec succès un ensemble de solutions}