Accueil > > > RESOLUTION DE TOUS LES PROBLEMES DE SUDOKU
RESOLUTION DE TOUS LES PROBLEMES DE SUDOKU
Information sur la source
Description
Ce code minimal résout les sudoku ! Il comprend 4 routines et un main et est indépendant de tout autre source. main : lit les problèmes et appelle la routine de résolution tree : exécute la recherche de la solution par parcours de l'arbre des cas possibles (7 lignes) possible : teste la validité d'un nombre sur une case prnt : print une grille readpb : lit le fichier contenant les problèmes (la syntaxe est: chiffre|point espace)voir exemple Durée d'exécution de l'ordre de la milliseconde/ problème. Testé sur plusieurs centaines de problèmes.
Source
- #include <stdio.h>
-
- /*
- * Je ne me suis pas cassé la tête pour faire une belle interface !
- * Seule la résolution par un programme minimum m'intéressait
- *
- * Il suffit de compiler (pas d'autres sources nécessaire) de faire un fichier sudoku.txt contenant les problèmes
- * et de lancer l'exécution !
- *
- */
-
- int tree(int);
- int possible(int, int);
- int readpb(FILE *);
- void prnt();
-
- int Tab[81];
-
- int main (void) {
- FILE *input = fopen("sudoku.txt", "r");
-
- if (input == NULL) {
- printf("sudoku.txt not found\n");
- return 1;
- }
-
- while (readpb(input)) { /* jusqu'à ce qu'il n'y ait plus de pb à résoudre */
- printf("\nProblem :\n");
- prnt(); /* print pb */
-
- tree(0); /* le 1er noeud passé à la recherche en arbre est la racine */
-
- printf("\nSolution :\n");
- prnt(); /* print solution */
- printf("\n");
- }
-
- fclose(input);
- return 0;
- }
-
- int tree(int level) {
- /*
- * C'est cette routine de 7 lignes C (hors commentaires) qui fait tout
- * Tab[] est une variable globale pour minimiser la pile dans la récursion
- */
-
- int i;
-
- /* traversée de l'arbre */
- if (level == 81) return 1; /* noeud final */
- if (Tab[level]) return tree(level + 1); /* case occupée => noeud valide */
-
- /* traversée du sous-arbre : noeud->frère */
- for (i = 1;i <= 9;i++) if (possible(level, i) && tree(level + 1)) return 1; /* traversée : noeud->fils */
- return (Tab[level] = 0); /* fin du sous-arbre : restauration noeud = free et return noeud->père */
- }
-
- int possible(int n, int test) {
- int i, j, q, r, p;
- /*
- * Test s'il est possible de placer le nombre test sur la case n, les cases sont numérotées de 0 à 80
- * de gauche à droite et ligne par ligne
- * retour = 1 possible, 0 pas possible.
- */
-
- q = n / 9;
- r = n - 9 * q;
- for (i = 0;i < 9;i++)
- if (Tab[9 * q + i] == test || Tab[9 * i + r] == test) return 0;
-
- q /= 3;
- r /= 3;
- p = 3 * (9 * q + r);
-
- for (i = 0;i < 3;i++)
- for (j = 0;j < 3;j++)
- if (Tab[p + 9 * i + j] == test) return 0;
- Tab[n] = test;
- return 1;
- }
-
-
- void prnt() {
- /*
- * print d'une grille
- */
- int i, j;
- for (i = 0;i < 9;i++, printf("\n"))
- for (j = 0;j < 9;j++)
- printf("%c ", Tab[9 * i + j] ? Tab[9 * i + j] + '0' : '.');
- }
-
- int readpb(FILE *input) {
- /* Exemple input file pour 3 problemes (sudoku.txt) :
- . . . . . . 3 . .
- . . . 9 . . . 7 .
- . . 9 . 5 . . 8 1
- 4 1 . . . 6 . . .
- . 6 . . 7 . . 2 .
- . . . 2 . . . 5 4
- 1 4 . . 3 . 2 . .
- . 8 . . . 2 . . .
- . . 5 . . . . . .
-
- . 6 . . . 3 1 8 .
- 2 . 1 6 5 . . . 7
- . . . . . . . . .
- 8 . 3 7 2 . . . 9
- . 1 . . . 5 2 3 .
- . . . . . . . . .
- . 8 7 3 . 4 . . .
- . 3 2 5 . 1 . . .
- . . . . . . 6 5 .
-
- . . 9 8 . . 1 . 7
- 7 6 . . 5 9 . 4 .
- . . . . . . . . .
- 8 1 . . 6 4 . 2 .
- . . 7 5 . . 8 . 6
- . . . . . . . . .
- 4 . 1 3 . 8 . . .
- 6 . 8 7 . 5 . . .
- . . . . . . 5 . 9
-
- */
- char buf[20];
- int i, j, k;
-
- if (fgets(buf, sizeof(buf), input) == 0) return 0;
-
- for (k = i = 0;i < 9;i++, fgets(buf, sizeof(buf), input))
- for (j = 0;j < 18;j += 2) Tab[k++] = buf[j] == '.' ? 0 : buf[j] - '0';
- return 1;
- }
#include <stdio.h>
/*
* Je ne me suis pas cassé la tête pour faire une belle interface !
* Seule la résolution par un programme minimum m'intéressait
*
* Il suffit de compiler (pas d'autres sources nécessaire) de faire un fichier sudoku.txt contenant les problèmes
* et de lancer l'exécution !
*
*/
int tree(int);
int possible(int, int);
int readpb(FILE *);
void prnt();
int Tab[81];
int main (void) {
FILE *input = fopen("sudoku.txt", "r");
if (input == NULL) {
printf("sudoku.txt not found\n");
return 1;
}
while (readpb(input)) { /* jusqu'à ce qu'il n'y ait plus de pb à résoudre */
printf("\nProblem :\n");
prnt(); /* print pb */
tree(0); /* le 1er noeud passé à la recherche en arbre est la racine */
printf("\nSolution :\n");
prnt(); /* print solution */
printf("\n");
}
fclose(input);
return 0;
}
int tree(int level) {
/*
* C'est cette routine de 7 lignes C (hors commentaires) qui fait tout
* Tab[] est une variable globale pour minimiser la pile dans la récursion
*/
int i;
/* traversée de l'arbre */
if (level == 81) return 1; /* noeud final */
if (Tab[level]) return tree(level + 1); /* case occupée => noeud valide */
/* traversée du sous-arbre : noeud->frère */
for (i = 1;i <= 9;i++) if (possible(level, i) && tree(level + 1)) return 1; /* traversée : noeud->fils */
return (Tab[level] = 0); /* fin du sous-arbre : restauration noeud = free et return noeud->père */
}
int possible(int n, int test) {
int i, j, q, r, p;
/*
* Test s'il est possible de placer le nombre test sur la case n, les cases sont numérotées de 0 à 80
* de gauche à droite et ligne par ligne
* retour = 1 possible, 0 pas possible.
*/
q = n / 9;
r = n - 9 * q;
for (i = 0;i < 9;i++)
if (Tab[9 * q + i] == test || Tab[9 * i + r] == test) return 0;
q /= 3;
r /= 3;
p = 3 * (9 * q + r);
for (i = 0;i < 3;i++)
for (j = 0;j < 3;j++)
if (Tab[p + 9 * i + j] == test) return 0;
Tab[n] = test;
return 1;
}
void prnt() {
/*
* print d'une grille
*/
int i, j;
for (i = 0;i < 9;i++, printf("\n"))
for (j = 0;j < 9;j++)
printf("%c ", Tab[9 * i + j] ? Tab[9 * i + j] + '0' : '.');
}
int readpb(FILE *input) {
/* Exemple input file pour 3 problemes (sudoku.txt) :
. . . . . . 3 . .
. . . 9 . . . 7 .
. . 9 . 5 . . 8 1
4 1 . . . 6 . . .
. 6 . . 7 . . 2 .
. . . 2 . . . 5 4
1 4 . . 3 . 2 . .
. 8 . . . 2 . . .
. . 5 . . . . . .
. 6 . . . 3 1 8 .
2 . 1 6 5 . . . 7
. . . . . . . . .
8 . 3 7 2 . . . 9
. 1 . . . 5 2 3 .
. . . . . . . . .
. 8 7 3 . 4 . . .
. 3 2 5 . 1 . . .
. . . . . . 6 5 .
. . 9 8 . . 1 . 7
7 6 . . 5 9 . 4 .
. . . . . . . . .
8 1 . . 6 4 . 2 .
. . 7 5 . . 8 . 6
. . . . . . . . .
4 . 1 3 . 8 . . .
6 . 8 7 . 5 . . .
. . . . . . 5 . 9
*/
char buf[20];
int i, j, k;
if (fgets(buf, sizeof(buf), input) == 0) return 0;
for (k = i = 0;i < 9;i++, fgets(buf, sizeof(buf), input))
for (j = 0;j < 18;j += 2) Tab[k++] = buf[j] == '.' ? 0 : buf[j] - '0';
return 1;
}
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Projet d'été sur SUDOKU!! Aidez-nous s'il vous plait... [ par Naruttibayo ]
Au préalable, nous tenons à remercier tous ceux qui contribuerons à notre projet...On nous demande d'écrire un programme C qui permet de Générer des G
sudoku en GTK [ par myossi ]
Bonjour,J'ai un projet de sudoku à faire en GTK. J'ai trouvé beaucoup de code de sudoku en C. Cependant, il est difficile, même si le GTK c'est du C,
algorithme génitique [ par rahma_bou22 ]
je veut avoir si c'est possible l'algorithme de probléme de sac à dos
Probleme avec backtracking [ par sda2 ]
Bonsoir à tous, Je vous expose vite mon probleme, je souhaite realiser un sudoku (9x9), cependant il ne resoud que les sudokus facile, moyen et lui re
Probleme backtracking [ par sda2 ]
Bonsoir à tous, Je vous expose vite mon probleme, je souhaite realiser un sudoku (9x9), cependant il ne resoud que les sudokus facile, moyen et lui r
Interface d'un sudoku sous Gtkmm [ par Jedi_Yoda ]
Je cherche a faire afficher dans les 81 labels le "int" resolu qui lui correpond. Mais le set_label(param) n'accepte que les parametres de types "ustr
algorithme de conversion de fichier [ par novaghost ]
Bonjour, j'aimerais un coup de pouce pour faire un algorithme de conversion de fichier texte. Voila je doit pour exercice, faire un programme qui conv
algorithme du bestfit [ par youma85 ]
salut tous le monde svp est ce que vous pouvez me donner l'algorithme qui permet de charger un prgramme et le décharger à la mémoire centrale en utili
systèmes experts [ par azamharir ]
Salut. Je suis en 4° année maîtrise informatique à une faculté des sciences et techniques. Notre prof nous a chargé de faire un mini projet dans le ca
Probleme avec un sudoku [ par thomasvd ]
Bonjour!je dois réaliser un jeu sudoku et je rencontre quelques problemes dont un qui m'embette particulierement et j'aimerais bien que quelqu'un m'or
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|