A voir également:
- Comment créer un sudoku sur excel
- Comment créer un groupe whatsapp - Guide
- Créer un compte google - Guide
- Créer un compte gmail - Guide
- Créer un compte instagram sur google - Guide
- Créer liste déroulante excel - Guide
17 réponses
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.
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.
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
16 mars 2006 à 23:00
16 mars 2006 à 23:00
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...
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...
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
25 mars 2006 à 09:13
25 mars 2006 à 09:13
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
<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
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
25 mars 2006 à 21:07
25 mars 2006 à 21:07
Encore pire :-)
Moi
>
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
29 juil. 2008 à 19:44
29 juil. 2008 à 19:44
Perso, je conseille le HTML/Javascript, c'est simple et pas besoin de compilateur.
J'y ai mis quelques heures pour le faire.
J'y ai mis quelques heures pour le faire.
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
17 mars 2006 à 19:25
17 mars 2006 à 19:25
Une interface graphique en Delphi ça me semble un bon choix...
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
arth
Messages postés
9374
Date d'inscription
mardi 27 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2016
1 291
16 mars 2006 à 22:55
16 mars 2006 à 22:55
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
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
TLa
Messages postés
57
Date d'inscription
mercredi 11 mai 2005
Statut
Membre
Dernière intervention
14 février 2009
12
22 juil. 2006 à 23:21
22 juil. 2006 à 23:21
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 https://www.hugedomains.com/domain_profile.cfm?d=koalog&e=com
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
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 https://www.hugedomains.com/domain_profile.cfm?d=koalog&e=com
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
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
23 juil. 2006 à 02:28
23 juil. 2006 à 02:28
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...
http://www.larmoire.info/jeux/sudoku/ (très gourmand en cpu au démarrage)
Joli...
TLa
Messages postés
57
Date d'inscription
mercredi 11 mai 2005
Statut
Membre
Dernière intervention
14 février 2009
12
15 mars 2007 à 23:21
15 mars 2007 à 23:21
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!
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 ;
}
/*====================================================================================== 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 ;
}
j'ai capté un jeu gratuit de sudoku en 3D vraiment pas mal : http://sudoku-3d.com ça devrait t'aider je pense :-)
arth
Messages postés
9374
Date d'inscription
mardi 27 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2016
1 291
16 mars 2006 à 23:03
16 mars 2006 à 23:03
Manque juste la chtite bibliothèque de départ, mais sinon ca semble intéressant.
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
16 mars 2006 à 23:14
16 mars 2006 à 23:14
Yep. Par contre la version python marche telle qu'elle...
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
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
arth
Messages postés
9374
Date d'inscription
mardi 27 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2016
1 291
17 mars 2006 à 18:22
17 mars 2006 à 18:22
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
Voila
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!
Merci!
random
Messages postés
1612
Date d'inscription
vendredi 26 novembre 2004
Statut
Membre
Dernière intervention
30 mars 2006
155
22 mars 2006 à 10:19
22 mars 2006 à 10:19
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
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
pierrelgd
Messages postés
1
Date d'inscription
dimanche 15 juillet 2007
Statut
Membre
Dernière intervention
15 juillet 2007
15 juil. 2007 à 15:51
15 juil. 2007 à 15:51
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
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
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
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
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
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
18 mars 2008 à 14:39
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
21 mars 2008 à 13:17
11 déc. 2008 à 19:04
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
9 mai 2015 à 23:44
Il suffit de créer des fonctions ou des procédures qui font les fonctions spécifiées , chaque action nécessaire à chaque étape annoncée de la part de Hamza vous la présentez sous forme de fonction ou procédure qui réalise l'objectif . Mais ici il faut bien tenir compte du nombre et des types de paramètres qui peuvent exister chaque fois dans les fonctions.
Bon travail :)
25 mai 2009 à 18:10
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