Rechercher : dans
Par :

Ecriture d'un programme pour SUDOKU

Dernière réponse le 18 nov 2009 à 20:51:08 wada, le 16 mar 2006 à 22:42:20 
 Signaler ce message aux modérateurs

Bonjour
j'ai quelques notions de programmation, et je voudrai ecrire un petit programme pour resoudre les SUDOKU!
1) quel langage simple sur PC puis-je utiliser?
2)est-il possible de se procurer gratuitement le compilateur adéquat? (cobol ou autre??)
3)y-a-t-il quelqu'un qui a deja fait ce type de programme?
MERCI à toutes et à tous de me lire
si quelqu'un pouvait m'apporter une petite aide, je lui en serai tres reconnaissant!!
à bientôt

Meilleures réponses pour « ecriture d'un programme pour SUDOKU » dans :
Désactiver l'exécution de certains programmes au démarrage VoirDésactiver l'exécution de certains programmes au démarrage - Windows 98/Me/2000/XP/Vista Avec msconfig Avec WinPatrol Avec Startuplite Avec CCleaner Remarques Lorsque vous installez des logiciels, certains s'exécutent à chaque...
Supprimer complètement un programme VoirMalgré la désinstallation d'un programme, il se peut que des clés de registre ou des fichiers soient encore présents sur le PC. Si la méthode "classique" (clic droit/supprimer) ne fonctionne pas, il suffit d'utiliser l'éditeur du registre. Mise en...
[Linux] Installer les programmes (gestion des paquets, compil) Voir************************************************************** * INSTALLER UN PROGRAMME SOUS LINUX : **** * LA GESTION DES PAQUETS ou COMMENT SE SIMPLIFIER LA VIE * * UN EXEMPLE DE COMPILATION POUR SE FAIRE LA MAIN ...
Télécharger Clavier + VoirClavier+ est un outil qui vous permet d'associer toutes les touches du clavier à une action, y compris la touche Windows. Les raccourcis créés peuvent être associés à un programme ou à un texte particulier. Pour prendre un exemple concret, créez des...
Analyste programmeur (développeur) VoirDéveloppeur Le métier de développeur (également nommé analyste-programmeur) consiste à concevoir et à développer une application informatique, c'est-à-dire transcrire un besoin en une solution informatique écrite dans un langage informatique....
Enterprise Resource Planning (ERP) - Progiciel de Gestion Intégr VoirIntroduction aux ERP Les ERP (en anglais Enterprise Resource Planning), aussi appelés Progiciels de Gestion Intégrés (PGI), sont des applications dont le but est de coordonner l'ensemble des activités d'une entreprise (activités dites verticales...
Introduction à la programmation des CGI VoirPrésentation de l'interface CGI Un script CGI (Common Gateway Interface, traduisez interface de passerelle commune) est un programme exécuté par le serveur web (on dit généralement « côté serveur »), permettant d'envoyer au navigateur de...

1

arth, le 16 mar 2006 à 22:55:15
  • +1

Bonjoir

alors le langage je dirais que tu peux le faire dans n'importe lequel, mais bon étant adepte du c et java, je ne saurais que te conseillais ceux-la. Pour le C tu as le compilateur Devc++ qui est gratuit ( http://www.bloodshed.net ), et pour java tu as le compilateur Eclipse, gratuit également ( http://www.ecipse.org ) .

Je te conseille aussi le site http://www.cppfrance.com , et sur lequel tu as des sources en c++ sur la résolution du sudoku. Tu peux je pense t'en inspirer pour réaliser ton programme, et voir meme améliorer l'algorithme

Bonne nuit

Répondre à arth

2

kilian, le 16 mar 2006 à 23:00:02
  • +1

Sur cette adresse il ya un implémentation en C et une autre en Python.
C'est fait par Rusty Russel (le concepteur principal du Firewall de Linux)
http://ozlabs.org/~rusty/index.cgi/tech/2005-06-20.html

Bonne chance, ça a l'air complexe...

Répondre à kilian

12

lami20j, le 25 mar 2006 à 09:13:26
  • +1

Salut kilian,
<ital>
ça a l'air complexe...</ital> tu as raison.

Regarde que dit un code Perl pour sudoku(version 4 et 3 lignes de code).

http://www.ecclestoad.co.uk/blog/2005/05/25/sudoku_solver_in_four_lines.html

Répondre à lami20j

13

kilian, le 25 mar 2006 à 21:07:10
  • +1

Encore pire :-)

Répondre à kilian

23

Moi, le 29 jui 2008 à 19:44:29

Perso, je conseille le HTML/Javascript, c'est simple et pas besoin de compilateur.
J'y ai mis quelques heures pour le faire.

Répondre à Moi

3

arth, le 16 mar 2006 à 23:03:56
  • +1

Manque juste la chtite bibliothèque de départ, mais sinon ca semble intéressant.

Répondre à arth

4

kilian, le 16 mar 2006 à 23:14:45
  • +1

Yep. Par contre la version python marche telle qu'elle...

Répondre à kilian

5

WADA, le 17 mar 2006 à 11:44:18

Bonjour
merci pour votre reponse....mais j'ai mal posé mon problème et vous prie de m'en excuser!
Je vais donc reformuler mon problème en tachant d'être plus clair
1) pouvez vous me dire quel est à votre avis le langage le plus adapté à ces differentes contraintes:
- compilateur gratuit à telecharger
- pour PC windows XP
- Possibilite de faire paraitre une grille (pour mon SUDOKU)
d'y inscrire des chiffres, et de les recuperer dans mon programme
-possibilité de faire reapparaitre la grille complétée avec d'autres chiffres
-apprentissage aisé du langage et documentation gratuite
si possible en FRANçAIS!!

Peut-etre suis-je en train de trop en demander et je m'en excuse!!

Merci à vous tous de me lire!
à bientot

Répondre à WADA

6

wada, le 17 mar 2006 à 16:11:35

Rebonjour les amis
C'est juste pour remonter le message, car je n'ai pas du encore tomber sur la bonne personne
Merci a vous tous de me lire et peut-être de me repondre.
WADA

Répondre à wada

7

arth, le 17 mar 2006 à 18:22:07
  • +1

Euh alors on te l'a un peu donné la réponse, les contraintes sont un peu bizarre, car tu peux aussi bien faire de l'affichage graphique en c, java, python ou autre. les compilateurs gratuits existent autant pour java, c , python,delphi,pascal . Je crois qu'après c'est à toi de choisir. Mais pour moi faire une interface est plus simple en java qu'en c en tout cas. Por les autres langages je ne sais pas. Pour les tutoriaux sur tous ces langages en francais je te conseile le site http://www.developpez.com

Voila

Répondre à arth

8

kilian, le 17 mar 2006 à 19:25:24
  • +1

Une interface graphique en Delphi ça me semble un bon choix...

Répondre à kilian

9

attila, le 21 mar 2006 à 20:47:19

Bonjour moi je dois creer une solveuse de sudoku en language C mais le pb c'est que je ne sais pas par ou commencer, Vous n'avez pas un algorithme a me passer?

Merci!

Répondre à attila

10

random, le 22 mar 2006 à 10:19:20

J'ai écrit un solver de sudoku
je me suis servi de vba avec interface excel
pour les algos voir wikipedia
le plus simple à programmer est assez facile on construit un array de 9x9 dans lequel on met "123456789"
on ajoute les contraintes ainsi si un 1 est donné en(1,1) on remplace le "123456789" par "1"
on propage les contraintes en lignes en colonnes et en carré pour toutes les cellules(?,1) différentesde (1,1) on ôte de "123456789" "1" et pour toutes les cellules (1,?) on fait de même, on continue avec les cellules de (1,1) à (3;3)
on reprend la grille depuis le début tant qu'elle évolue
ensuite on prend en compte les contraintes implicites un chiffre
par colonne par ligne par carré et leurs combinaisons
ce modèle doit itérer tant qu'on fait évoluer la grille
à ce moment soit la grille est complète (toutes les grilles faciles
sont résolues avec moins de chiffres entrés que le problème n'en donne)
sinon le plus payant est de procèder par essai erreur à partiir des
doublets restants


elle est pas belle, la vie ?

Répondre à random

18

pierrelgd, le 15 jui 2007 à 15:51:10
  • +3

Salut,
je fais un programme de resolution sudoku sur excell
je trouve pas le tien pour comparer
peux-tu me donner l'emplacement exact
ou me donner le lien
Merci

Répondre à pierrelgd

11

Jack, le 22 mar 2006 à 22:18:00
  • +1

Bonsoir à tous.

Alors moi j'ai fait un petit site, et pour attirer les visiteurs je voudrais y inclure le jeu du Sudoku. Comment faire ?

Merci d'avance pour vos réponses.

Répondre à Jack

15

TLa, le 22 jui 2006 à 23:21:38
  • +1

Salut,

J'ai codé une page html / javascript pour m'aider à resoudre les sudoku :
http://www.larmoire.info/jeux/sudoku/ (très gourmand en cpu au démarrage)

la version en C++ : http://www.larmoire.info/jeux/sudoku/sudoku.cpp
compilé avec djgpp (un gcc pour windows) ou gcc sous linux
l'interface est en ligne de commande

puis une surcouche à l'excellent site http://sudoku.koalog.com/php/sudoku.php
qui a le défaut d'afficher les chiffres mal placés par rapport à la solution et non pas ceux qui enfraignent les regles,
http://www.larmoire.info/jeux/sudoku/koalog.tcl

Répondre à TLa

16

kilian, le 23 jui 2006 à 02:28:06
  • +1

J'ai codé une page html / javascript pour m'aider à resoudre les sudoku :
http://www.larmoire.info/jeux/sudoku/ (très gourmand en cpu au démarrage)


Joli...

Répondre à kilian

17

TLa, le 15 mar 2007 à 23:21:36
  • +1

La surcouche koalog a changé d'adresse

http://www.larmoire.info/jeux/sudoku/koalog/

Répondre à TLa

19

shryke2a, le 6 déc 2007 à 13:19:47
  • +1

Ba en fait je voudrais savoir où apprendre la programmation mais quand je dis apprendre c'est pas un tuto c'est un truc aprés lequel je pourrais me débrouilller tout seul!

Répondre à shryke2a

20

TAMZA, le 2 mar 2008 à 11:27:29
  • +4

Bonjour ,je suis un etudiant du FST de TUNIS, j ais deja programmer en C la solution des problemes SODUKU .
Je vous dits,en tant que future ingenieur, que la conception est plus importante dans ce genre de problemes.
Voici a quoi peut ressembler la conception de ce programme:
1- Balayer chaque sousmatrice (ou tableau) 3*3 a la recherche d un element nul
2-Associer a chaque case vide trouvee une structure contenant un tableau 'V' de taille 9 de probabilitees initialisee a 0
3-Balayer les deux ligne et colonne (du SODUKU 9*9)correspondants a l element nul trouvee : si elles ne contiennent pas un certain chiffre 'a' la case de meme rang de 'V' recoit 1
4-Iterer ce processus jusqu a la trouvaille d un vecteur(ou tableau 'V') ne contenant qu un seule element egale a 1,de ce fait la case correspondante a ce tableau 'V' recoit la valeur du rang contenant ce 1
5-Iterer ces 4 etapes tant de fois necessaires en fonction du complexitee du SODUKU (mon programme realise de 3 a 7 iterations)

En fin ,je m excuse pour ne pas entrer dans les details structurelles ,j ais l honneur de vous repondre ,contactez moi ,et merci.

Répondre à TAMZA

21

fleez, le 18 mar 2008 à 14:39:46

Salut Tamza,
je dois faire un projet informatique sur la programmation d'un sudoku en langage EXCEL/VBA ou JavaScript.
As tu déjà procédé à ce genre de chose et pourrais tu m'aider ?
merci beaucoup d'avance

Répondre à fleez

22

imen, le 21 mar 2008 à 13:17:05

Salut je veux faire un programme sudoku mais je ne sais pas par quoi commencer est ce tu pourrait m'aider

Répondre à imen

25

samanthaoups, le 11 déc 2008 à 19:04:32
  • +1

Bonsoir hamza
je suis attendu à faire un programme en c qui permet de resoudre un sudoku
c à dire je ss amenée à faire une grille et de la résoudre
si c'est possible je voudrais bien que tu m'aide et que tu me dise comment y procéder parceque franchement je ne sais pas par où commencer :s
merci d'avance tamza

Répondre à samanthaoups

28

rody, le 25 mai 2009 à 18:10:30

Salu RAMKA c'est rodys enfait je suis un étudiant en infirmatique IST GABON et j'ai projet que le prof ns a demander de voir sur le web et apparement toi sava.
Voila esk u peu m'envoyer le programme en C d'une resolution d'une grille du sudoku je ferais un effort de comprendre (avec des commentaires ci possible) Envoie le moi sur mon émail stp

merci encore

Répondre à rody

24

Brice, le 4 sep 2008 à 11:31:16

Bonjour,

http://phpsudo.free.fr

Sudoku Open source en php et javascript. Grilles 4*4, 6*6, 8*8, 9*9, 10*10, 12*12, 14*14 et 16*16 chiffres et lettres ! Solution unique, grilles illimitées et 3 niveaux de difficultés... A suivre...

Je le trouve pas mal

Répondre à Brice

26

loiso, le 21 avr 2009 à 18:24:43

Bonjour!
et en python ça donne quoi? Comment faire la fonction affiche? J'ai déjà crée ma liste de liste.
merci d'avance

Répondre à loiso

27

henrin, le 16 mai 2009 à 22:58:13

J'en ai écrit un en C il y a 2 ou 3 ans. Le problème, c'est l'IHM.
En VB, c'est sûrement plus facile.

Je l'ai repris en Python il y a un an avec beaucoup plus de plaisir
et de performances :
- recherche des solutions simples en premier,
- interactivité avec possibilité de retour en arrière
- possibilité de voir toutes les solutions

L'avantage de Python, outre sa gratuité,
c'est qu'il est très facile à installer et à mettre en oeuvre.
Une IDE formidable et gratuite, c'est Wing101.
Pour la doc, celle d'ActivePython (1 fichier .chm) est très pratique.

Pour l'IHM, Tkinter va bien. On peut s'en sortir tout lire.

Enfin, pour la conception, il est important de maitriser :
- les tableaux, les indices,
- les indirections avec des index,
- la récursivité

Bonne chance

Répondre à henrin

31

 elsa, le 18 nov 2009 à 20:51:08
  • +1

Salut Henri
tu dis que tu as déjà fais un algo pour résoudre un sudoku en C.
Moi je dois faire un algo pour le futoshiki. je voulais justement m'aider de l'algo du sudoku mais j'en trouve pas en C. est ce que tu peux m'aider.
merci beaucoup

Répondre à elsa

29

henrin, le 15 jun 2009 à 12:30:05

Ci-joint le code du solveur (hors IHM) :

Répondre à henrin

30

henrin, le 15 jun 2009 à 12:41:53

Voici le source :

/*==========================================================­============================ SUDOKU ==

Global:

kuMain main grid

Basic operations:

gridClear
gridCopy
cellDisplay part of gridDisplay
gridDisplay show a grid
gridGet read and check the displayed grid

Grid computing:

gridCheck checks if a grid is valid
gridPossible preliminary computatiion for solving
gridExtract partial solve
gridFill partial solve
gridSolve recursive solve the input grid

Other functions:

msg

Functions not included in this listing:

fileI/O
user interface
============================================================­====================================*/

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>

#define STD 2
#define ERR 1
#define FATAL 0

#define SINGLE 1
#define SHOW 2
#define SEARCH 4

#define N 3 /* SUDOKU dimension */
#define N2 (N * N)
#define N4 (N2*N2)

#define SOLMAX 10 /* maximum number of solutions */

/* sudoku grid definition */
typedef char KU[N2][N2][N2+1] ; /* if KU[row][col][0] > 0 it is the defined value */
/* else KU[row][col][val]= 1 if val is a possible value */
KU kuMain ;

int gridCheck(KU ku) ;


/*----------------------------------------------------------------------------------------------*/
void msg(int mask, char *fmt,...) /* show std, error or fatal message */
/*----------------------------------------------------------------------------------------------*/
{
char s[1024] = "" ; /* buffer for building the error message */
int s1 = 0 ; /* character or message count */
va_list ap ;

if (mask == ERR)
{
Beep() ;
s1 = sprintf(s, "%s", "** ERREUR ** ") ;
}

va_start(ap, fmt) ; /* build the error message */
vsprintf(s + s1, fmt, ap) ;
va_end(ap) ;

/* display message */

switch (mask)
{
case STD :
case ERR :
break ;
case FATAL :
/* display fatal message */
exit(1) ;
}
}


/*===================================================================== BASIC OPERATION & I/O ==*/

/*----------------------------------------------------------------------------------------------*/
void gridClear(KU ku) /* clear only the visible part */
/*----------------------------------------------------------------------------------------------*/
{
int r, c ;
for (r = 0 ; r < N2 ; r++)
for (c = 0 ; c < N2 ; c++)
ku[r][c][0] = 0 ;
}

/*----------------------------------------------------------------------------------------------*/
void gridCopy(KU kuSrc, KU kuDest) /* copy grid kuSrc to kuDest */
/*----------------------------------------------------------------------------------------------*/
{
int r, c ;
for (r = 0 ; r < N2 ; r++)
for (c = 0 ; c < N2 ; c++)
kuDest[r][c][0] = kuSrc[r][c][0] ;
}

/*----------------------------------------------------------------------------------------------*/
void cellDisplay(int r, int c, int v, int bold)
/*----------------------------------------------------------------------------------------------*/
{
char s[2] = " " ;
int color ;
s[0] = v + '0' ;
if (s[0] == '0') s[0] = '\0' ;

/* display text s in the cell at column c and row r */
/* text attribute: bold */
}

/*----------------------------------------------------------------------------------------------*/
void gridDisplay(KU ku) /* display grid on UIR */
/*------------------------------------------------------------------------------------------------
This function displays the source grid (kuMain) with bold characters.
If the solution (ku) is defined (not null), it is displayed with normal characters.
------------------------------------------------------------------------------------------------*/
{
int r, c, v ;
for (r = 0 ; r < N2 ; r++)
for (c = 0 ; c < N2 ; c++)
{
char k = kuMain[r][c][0] ; /* source grid */
int bold = 1 ;
cellDisplay(r, c, k, 1) ;
if (ku && k == 0) /* filled data */
{
k = ku[r][c][0] ;
bold = 0 ;
}
cellDisplay(r, c, k, bold) ;
}
}

/*----------------------------------------------------------------------------------------------*/
int gridGet(KU ku) /* get grid from UIR - result = same as gridCheck() */
/*----------------------------------------------------------------------------------------------*/
{
int e, r, c ;

gridClear(ku) ;
for (r = 0 ; r < N2 ; r++)
for (c = 0 ; c < N2 ; c++)
{
char s[16] ;
int ic ;

/* get the text of the cell at column c and row r */
switch (strlen(s))
{
case 0 :
ic = 0 ;
break ;
case 1 :
ic = s[0] - '0' ;
if (ic >= 1 && ic <= N2) break ;
default :
msg(ERR, "Cellule non valide") ;
return -1 ;
}
ku[r][c][0] = ic ;
}

e = gridCheck(ku) ;
if (e < 0)
msg(ERR, "Grille non valide") ;
return e ;
}


/*============================================================================ GRID COMPUTING ==*/

/*----------------------------------------------------------------------------------------------*/
int gridCheck(KU ku) /* check if a grid is valid */
/*------------------------------------------------------------------------------------------------
This function returns the number of defined cells, and -1 if the grid is not valid.
------------------------------------------------------------------------------------------------*/
{
int b, r, c, rf, cf, v ;
int count[N2 + 1] ; /* index = 1..N2 */
int defined = 0 ;

for (r = 0 ; r < N2 ; r++) /* check values */
for (c = 0 ; c < N2 ; c++)
{
v = ku[r][c][0] ;
if (v < 0 || v > N2)
return -1 ;
if (v > 0)
defined++ ;
}

for (r = 0 ; r < N2 ; r++) /* process rows */
{
for (v = 1 ; v <= N2 ; v++) count[v] = 0 ; /* reset counts */
for (c = 0 ; c < N2 ; c++) /* count defined */
if (v = ku[r][c][0]) count[v]++ ;
for (v = 1 ; v <= N2 ; v++) /* check counts */
if (count[v] > 1)
return -1 ;
}

for (c = 0 ; c < N2 ; c++) /* process columns */
{
for (v = 1 ; v <= N2 ; v++) count[v] = 0 ; /* reset counts */
for (r = 0 ; r < N2 ; r++) /* count defined */
if (v = ku[r][c][0]) count[v]++ ;
for (v = 1 ; v <= N2 ; v++) /* check counts */
if (count[v] > 1)
return -1 ;
}


for (b = 0 ; b < N2 ; b++) /* process blocks */
{
int r1 = N * (b / N) ;
int c1 = (N * b) % N2 ;
for (v = 1 ; v <= N2 ; v++) count[v] = 0 ; /* reset counts */
for (c = c1 ; c < c1 + N ; c++) /* count defined */
for (r = r1 ; r < r1 + N ; r++)
if (v = ku[r][c][0]) count[v]++ ;
for (v = 1 ; v <= N2 ; v++) /* check counts */
if (count[v] > 1)
return -1 ;
}

return defined ; /* grid is valid */
}

/*----------------------------------------------------------------------------------------------*/
int gridPossible(KU ku) /* set and count the possible values */
/*----------------------------------------------------------------------------------------------*/
{
int r, c, v ;
int possible = 0 ; /* counter */

for (r = 0 ; r < N2 ; r++)
for (c = 0 ; c < N2 ; c++)
{
int r1, c1, r2, c2 ;

if (ku[r][c][0]) /* case defined cell */
{
for (v = 1 ; v <= N2 ; v++) /* none are possible */
ku[r][c][v] = 0 ;
continue ;
}

for (v = 1 ; v <= N2 ; v++) /* at first: all are possible */
ku[r][c][v] = 1 ;
for (c1 = 0 ; c1 < N2 ; c1++) /* process row */
{
if (v = ku[r][c1][0])
ku[r][c][v] = 0 ;
}
for (r1 = 0 ; r1 < N2 ; r1++) /* process column */
{
if (v = ku[r1][c][0])
ku[r][c][v] = 0 ;
}
c1 = N * (c / N) ; /* process block */
c2 = c1 + N ;
for ( ; c1 < c2 ; c1++)
{
r1 = N * (r / N) ;
r2 = r1 + N ;
for ( ; r1 < r2 ; r1++)
{
if (v = ku[r1][c1][0])
ku[r][c][v] = 0 ;
}
}
for (v = 1 ; v <= N2 ; v++) /* count the number of possibles */
if (ku[r][c][v]) possible++ ;
}

return possible ;
}

/*----------------------------------------------------------------------------------------------*/
int gridExtract(KU ku) /* extract single possible values */
/*------------------------------------------------------------------------------------------------
Result is the number of found values, or -1 if error
------------------------------------------------------------------------------------------------*/
{
int r, c, v ;
for (r = 0 ; r < N2 ; r++)
for (c = 0 ; c < N2 ; c++)
{
int found = 0 ;
if (ku[r][c][0]) continue ; /* skip defined cells */

for (v = 1 ; v <= N2 ; v++)
{
if (ku[r][c][v])
{
if (found) break ; /* break if > 1 possible */
found = v ;
}
}
if (v <= N2) continue ; /* and skip cell */
if (found == 0)
return -1 ;

ku[r][c][0] = found ;
return 1 ;
}
return 0 ;
}

/*----------------------------------------------------------------------------------------------*/
int gridFill(KU ku) /* insert values */
/*----------------------------------------------------------------------------------------------*/
{
int b, r, c, rf, cf, v ;

for (r = 0 ; r < N2 ; r++) /* process rows */
for (v = 1 ; v <= N2 ; v++) /* search for v */
{
int found = 0 ;
for (c = 0 ; c < N2 ; c++) /* skip if defined */
if (ku[r][c][0] == v)
{
found = 1 ;
break ;
}
if (found) continue ;
for (c = 0 ; c < N2 ; c++) /* count number of possibles */
{
if (ku[r][c][0] == 0 && ku[r][c][v])
{
if (++found > 1) break ;
cf = c ;
}
}
if (found == 1) /* if only one: set value */
{
ku[r][cf][0] = v ;
return 1 ;
}
}

for (c = 0 ; c < N2 ; c++) /* process columns */
for (v = 1 ; v <= N2 ; v++) /* search for v */
{
int found = 0 ;
for (r = 0 ; r < N2 ; r++) /* skip if defined */
if (ku[r][c][0] == v)
{
found = 1 ;
break ;
}
if (found) continue ;
for (r = 0 ; r < N2 ; r++) /* count number of possibles */
{
if (ku[r][c][0] == 0 && ku[r][c][v])
{
if (++found > 1) break ;
rf = r ;
}
}
if (found == 1) /* if only one: set value */
{
ku[rf][c][0] = v ;
return 1 ;
}
}

for (b = 0 ; b < N2 ; b++) /* process blocks */
{
int r1 = N * (b / N) ;
int c1 = (N * b) % N2 ;
for (v = 1 ; v <= N2 ; v++) /* search for v */
{
int found = 0 ;
for (c = c1 ; c < c1 + N ; c++) /* skip if defined */
{
for (r = r1 ; r < r1 + N ; r++)
if (ku[r][c][0] == v)
{
found = 1 ;
break ;
}
if (found) break ;
}
if (found) continue ;
for (c = c1 ; c < c1 + N ; c++) /* count number of possibles */
{
for (r = r1 ; r < r1 + N ; r++)
{
if (ku[r][c][0] == 0 && ku[r][c][v])
{
if (++found > 1) break ;
rf = r ;
cf = c ;
}
}
if (found > 1) break ;
}
if (found == 1) /* if only one: set value */
{
ku[rf][cf][0] = v ;
return 1 ;
}
}
}

return 0 ;
}

/*----------------------------------------------------------------------------------------------*/
int gridSolve(KU ku, int level, int stat) /* solver */
/*------------------------------------------------------------------------------------------------
ku : grid input/output
level : depth of the recursive solver input
stat : search mode - bit fields: SEARCH, SHOW input
result : number of solutions found
------------------------------------------------------------------------------------------------*/
{
static solutionNb ;
int r, c, v ;
int e, found ;

if (level == 0) /* first call */
solutionNb = 0 ;

for (;;) /* direct solver */
{
e = gridCheck(ku) ; /* number of cells defined */
if (e < 0) return 0 ; /* invalid grid */
if (e == N4) /* solution found */
{
solutionNb++ ;
if (solutionNb > SOLMAX) stat = 0 ;

if ((stat & SHOW) && solutionNb > 1)
{
char l[64] ;
sprintf(l, "Voir solution n°% d ?", solutionNb) ;
if (ConfirmPopup(l) == 0) stat = 0 ;
}

if (stat & SHOW) gridDisplay(ku) ;
return solutionNb ;
}

gridPossible(ku) ;
found = gridExtract(ku) ;
if (found < 0) /* case error */
return 0 ;
if (found == 0)
found = gridFill(ku) ;
if (stat & SINGLE)
{
if (found)
{
found = 0 ; /* search last defined */
for (r = 0 ; r < N2 ; r++)
{
for (c = 0 ; c < N2 ; c++)
if (found = ku[r][c][ku[r][c][0]]) break ;
if (found) break ;
}
msg(STD, "Ligne %d, colonne %d : %d", r + 1, c + 1, ku[r][c][0]) ;
}
else
msg(STD, "pas de solution simple") ;
return 0 ;
}
if (found == 0)
break ;
}

found = 0 ; /* hytothesis trial */
for (r = 0 ; r < N2 ; r++) /* search undefined cell */
{
for (c = 0 ; c < N2 ; c++)
if (found = (ku[r][c][0] == 0)) break ;
if (found) break ;
}

for (v = 1 ; v <= N2 ; v++) /* try loop on the possible values */
{
if (ku[r][c][v])
{
KU kuTry ;
ku[r][c][0] = v ;
gridCopy(ku, kuTry) ;
gridSolve(kuTry, level + 1, stat) ;
if ((stat & SEARCH) == 0) return solutionNb ;
}
}

return solutionNb ;
}

Répondre à henrin
Collection CommentÇaMarche.net