web-dev-qa-db-fra.com

Comment générer des cartes Sudoku avec des solutions uniques

Comment générer une carte Sudoku avec une solution unique? Ce que je pensais, c'était d'initialiser un tableau aléatoire, puis de supprimer quelques chiffres. Mais ma question est de savoir comment conserver le caractère unique d'une solution?

58
guilin 桂林

Facile:

  1. Trouvez toutes les solutions avec un algorithme de retour en arrière efficace.
  2. S'il n'y a qu'une seule solution, vous avez terminé. Sinon, si vous avez plusieurs solutions, trouvez une position à laquelle la plupart des solutions diffèrent. Ajoutez le numéro à cette position.
  3. Allez à 1.

Je doute que vous puissiez trouver une solution qui serait beaucoup plus rapide que cela.

29
TMS

Voici comment fonctionne mon propre programme SuDoKu:


  1. Commencez avec un tableau complet et valide (rempli de 81 numéros).

  2. Faites une liste des 81 positions de cellule et mélangez-la au hasard.

  3. Tant que la liste n'est pas vide, prenez la position suivante dans la liste et supprimez le numéro de la cellule associée.

  4. Testez l'unicité à l'aide d'un solveur de retour rapide. Mon solveur est - en théorie - capable de compter toutes les solutions, mais pour tester l'unicité, il s'arrêtera immédiatement lorsqu'il trouvera plus d'une solution.

  5. Si la carte actuelle n'a encore qu'une seule solution, passez à l'étape 3) et répétez.

  6. Si la carte actuelle a plus d'une solution, annulez la dernière suppression (étape 3) et passez à l'étape 3 avec la position suivante de la liste

  7. Arrêtez-vous lorsque vous avez testé les 81 positions.


Cela vous donne non seulement des cartes uniques, mais des cartes où vous ne pouvez plus supprimer de numéros sans détruire l'unicité de la solution.

Bien sûr, ce n'est que la seconde moitié de l'algorithme. La première moitié consiste à trouver une carte complète valide en premier (remplie au hasard!) Cela fonctionne très similaire, mais "dans l'autre sens":


  1. Commencez avec un tableau vide.

  2. Ajoutez un nombre aléatoire à l'une des cellules libres (la cellule est choisie au hasard et le nombre est choisi au hasard dans la liste des nombres valides pour cette cellule selon les règles SuDoKu).

  3. Utilisez le solveur de retour arrière pour vérifier si la carte actuelle a au moins une solution valide. Sinon, annulez l'étape 2 et répétez avec un autre numéro et une autre cellule. Notez que cette étape peut produire seule des cartes valides, mais celles-ci ne sont en aucun cas aléatoires.

  4. Répétez jusqu'à ce que le tableau soit complètement rempli de chiffres.

48
Doc Brown

Vous pouvez tricher. Commencez avec une carte Sudoku existante qui peut être résolue, puis jouez avec.

Vous pouvez échanger n'importe quelle rangée de trois blocs 3x3 avec n'importe quelle autre rangée. Vous pouvez échanger n'importe quelle colonne de trois blocs 3x3 avec une autre colonne. Dans chaque ligne ou colonne de bloc, vous pouvez permuter des lignes et des colonnes uniques. Enfin, vous pouvez permuter les nombres afin qu'il y ait des nombres différents dans les positions remplies tant que la permutation est cohérente sur l'ensemble du tableau.

Aucun de ces changements ne rendra insoluble une carte résoluble.

16
rossum

À moins que P = NP, il n'y a pas d'algorithme en temps polynomial pour générer des problèmes généraux de Sudoku avec exactement une solution.

Dans sa thèse de maîtrise, Takayuki Yato a défini The Another Solution Problem (ASP), où le but est, étant donné un problème et une solution, de trouver une solution différente à ce problème ou de montrer qu'il n'en existe pas. Yato a ensuite défini ASP-complétude, problèmes pour lesquels il est difficile de trouver une autre solution, et a montré que Sudoku est ASP-complet. Puisqu'il prouve également que la complétude ASP implique une dureté NP, cela signifie que si vous autorisez des cartes Sudoku de taille arbitraire, il n'y a pas d'algorithme en temps polynomial pour vérifier si le puzzle que vous avez généré a une solution unique (sauf si P = NP).

Désolé de gâcher vos espoirs pour un algorithme rapide!

10
templatetypedef

Ce n'est pas facile de donner une solution générique. Vous devez savoir quelques choses pour générer un type spécifique de Sudoku ... par exemple, vous ne pouvez pas construire un Sudoku avec plus de neuf groupes de 9 numéros vides (lignes, blocs ou colonnes 3x3). On pense que le nombre minimum donné (c'est-à-dire les "indices") dans un Sudoku à solution unique est de 17, mais les positions numériques pour ce Sudoku sont très spécifiques si je ne me trompe pas. Le nombre moyen d'indices pour un Sudoku est d'environ 26, et je ne suis pas sûr, mais si vous quittez les numéros d'une grille complète jusqu'à ce que vous en ayez 26 et que vous les laissiez de manière symétrique, vous pouvez avoir un Sudoku valide. D'un autre côté, vous pouvez simplement quitter au hasard les numéros des grilles terminées et les tester avec CHECKER ou d'autres outils jusqu'à ce qu'il aboutisse à un OK.

1
Daniel

Voici un moyen de créer un puzzle sudoku classique (puzzle sudoku avec une seule et unique solution; les carrés pré-remplis sont symétriques autour du carré central R5C5).

1) commencez par une grille complète (en utilisant le remplissage de groupe et le décalage circulaire pour l'obtenir facilement)

2) supprimer le (s) nombre (s) de deux carrés symétriques si les carrés effacés peuvent être déduits en utilisant les indices restants.

3) répétez (2) jusqu'à ce que tous les nombres soient vérifiés.

En utilisant cette méthode, vous pouvez créer un puzzle sudoku très facile avec ou sans programmation. Vous pouvez également utiliser cette méthode pour créer des puzzles Sudoku plus difficiles. Vous voudrez peut-être rechercher "créer un sudoku classique" sur YouTube pour avoir un exemple étape par étape.

1
Yaling Zheng

La solution est divisée en 2 parties:
UNE. Générer le modèle numérique 600 milliards
B. Génération du motif de masquage ~ combinaisons 7e2

A) Pour le modèle de nombre, le moyen le plus rapide qui peut générer des combinaisons uniques avec PAS le temps passé à retracer ou à tester

Étape 1. Choisissez une matrice déjà existante, j'ai choisi celle ci-dessous car elle peut être facilement créée par l'homme sans l'aide d'un ordinateur ou d'un solveur:

La première ligne est des nombres dans l'ordre croissant
La deuxième rangée est également dans l'ordre croissant, mais commencez à partir de 4 et roulez
La troisième rangée est également dans l'ordre croissant, mais commencez à partir de 7 et roulez
Rangée 4,5,6: Remplacez la colonne à trois cellules par la colonne en haut à droite - 2 5 8 et roulez dans la cellule 3x3 pour la dernière colonne
Ligne 7,8,9: Remplacez la colonne à trois cellules par la colonne en haut à droite - 3 6 9 et roulez dans la cellule 3x3 pour la dernière colonne

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 1 5 6 4 8 9 7
5 6 4 8 9 7 2 3 1
8 9 7 2 3 1 5 6 4
3 1 2 6 4 5 9 7 8
6 4 5 9 7 8 3 1 2
9 7 8 3 1 2 6 4 5

Étape 2. Mélangez les chiffres et remplacez-les dans toutes les autres cellules
Étape 3. Réorganisez au hasard les colonnes 1, 2 et 3
Étape 4. Réorganisez au hasard les colonnes 4, 5 et 6
Étape 5. Réorganisez aléatoirement les colonnes 7, 8 et 9 en leur sein
Étape 6. Réorganisez au hasard les lignes 1, 2 et 3
Étape 7. Réorganisez aléatoirement les rangées 4, 5 et 6
Étape 8. Réorganisez aléatoirement les lignes 7, 8 et 9
Étape 9. Réorganisez au hasard en 3 groupes de colonnes de taille 9x3
Étape 10. Réorganisez aléatoirement en groupes de 3 rangées de taille 3x9

voila ...

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

B) Pour Masking Pattern, nous devons avoir un algorithme de solveur. Comme nous avons déjà une grille numérique tout à fait unique (qui est également résolue!), Cela nous donne des performances plus rapides pour l'utilisation du solveur

Étape 1: Commencez par sélectionner 15 emplacements aléatoires sur les 81.
Étape 2: Vérifiez avec le solveur s'il a une solution unique
Étape 3: Si la solution n'est pas unique, sélectionnez un emplacement supplémentaire. itérer les étapes 2 et 3 jusqu'à ce qu'une solution unique soit trouvée

Cela devrait vous donner la carte Sudoku très unique et rapide.

1
gapjiba

Je pense également que vous devrez vérifier explicitement l'unicité. Si vous avez moins de 17 données, une solution unique est très peu probable, cependant: aucune n'a encore été trouvée, bien qu'il ne soit pas encore clair si elle pourrait exister.)

Mais vous pouvez également utiliser un solveur SAT, au lieu d'écrire un algorithme de retour arrière. De cette façon, vous pouvez dans une certaine mesure régler la difficulté de trouver une solution: si vous restreignez les règles d'inférence utilisées par le solveur SAT, vous pouvez vérifier si vous pouvez résoudre le puzzle facilement. Juste google pour "SAT résoudre le sudoku".

0
DaveFar