Programmation Sudoku.c + ez-draw
ceto13
Messages postés
7
Statut
Membre
-
fiddy Messages postés 11653 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11653 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
je dois pour un projet de fin d'année réaliser un sudoku en c et non c++. Or je rencontre quelque souci. Je dois en effet ecrire une fonction qui renvoi "vrai si et seulement si on peut placer k dans la case de coordonnées (i,j)"
Voila le début de mon programme. Petite précision je suis tenus de grader ce qu'il y a deja d'inscrit je n'ai donc pas vraiment beaucoup de marche de manœuvre pour pouvoir réadapter le programme de manière a ce que ça conception soit plus simple :
Merci d'avance pour votre aide
je dois pour un projet de fin d'année réaliser un sudoku en c et non c++. Or je rencontre quelque souci. Je dois en effet ecrire une fonction qui renvoi "vrai si et seulement si on peut placer k dans la case de coordonnées (i,j)"
Voila le début de mon programme. Petite précision je suis tenus de grader ce qu'il y a deja d'inscrit je n'ai donc pas vraiment beaucoup de marche de manœuvre pour pouvoir réadapter le programme de manière a ce que ça conception soit plus simple :
#include "ez-draw.h"
#define TAILLE_CASE 36
#define HAUT_TITRE 25
#define HAUT_LEGENDE 10
enum {false,true};
typedef unsigned char Boolean;
// les pavés sont numérotés de 0 à 8 ainsi que les lignes et les colonnes.
// Pave[i][j] vrai ssi j est présent dans le pavé n°i.
// l[i][j] vrai ssi j est présent dans la ligne n° i.
// c[i][j] vrai ssi j est présent dans la colonne n° i.
Boolean pave[9][10], l[9][10], c[9][10];
int enonce[9][9]={
{7,9,0,0,4,0,0,0,0},
{0,0,4,0,1,0,8,7,0},
{0,0,0,0,0,2,0,6,0},
{0,5,6,0,0,1,0,0,3},
{0,0,0,0,5,0,0,0,0},
{3,0,0,8,0,0,7,1,0},
{0,8,0,2,0,0,0,0,0},
{0,3,5,0,8,0,1,0,0},
{0,0,0,0,6,0,0,5,8}
};;
int grille[9][9];
enum {MODE_SOL,MODE_JEU};
int mode=MODE_JEU;
// i_clic et j_clic indique les indices ligne et colonne de la case où l'on a cliqué
// -1 indiquant que l'on a cliqué en dehors de la grille
int i_clic=-1, j_clic=-1;
// win fenêtre de jeu, win2 fenêtre d'aide
Window win,win2=None;;
// possible renvoie vrai ssi on peut placer k dans la case de coordonnées (i,j)
Boolean possible (int i,int j,int k)
{
// .............. à compléter..........
}
Merci d'avance pour votre aide
A voir également:
- Programmation Sudoku.c + ez-draw
- Ez update - Télécharger - Utilitaires
- Application de programmation - Guide
- Ez pdf - Télécharger - PDF
- Ez debug led dram ✓ - Forum Carte-mère/mémoire
- Ez debug led vga - Forum Carte graphique
3 réponses
Salut,
enum {false,true};
Ca serait mieux de faire : typedef enum { false, true } Boolean;
<mode puriste>Sinon tu as le type _Bool qui existe si tu utilises la norme C99. Si tu n'utilises l'ancienne norme, tu dois remplacer tes doubles slashs (commentaires) par la version slash étoilé.</mode puriste>
Sinon évite les variables globales. Passe plutôt tes variables en arguments.
Window win,win2=None;;
Un seul point-virgule suffit.
Et enfin, pour répondre à la question tant attendue :
Dans un premier temps, tu dois être capable à partir du couple (i,j) de déterminer le sous-carré avec de simples opérations arithmétiques. Ensuite, il te restera à vérifier que ta variable "k" n'est pas présente dans la ligne i, dans la colonne j et dans le sous-carré.
Si tu as des questions, n'hésite pas.
Cdlt
enum {false,true};
Ca serait mieux de faire : typedef enum { false, true } Boolean;
<mode puriste>Sinon tu as le type _Bool qui existe si tu utilises la norme C99. Si tu n'utilises l'ancienne norme, tu dois remplacer tes doubles slashs (commentaires) par la version slash étoilé.</mode puriste>
Sinon évite les variables globales. Passe plutôt tes variables en arguments.
Window win,win2=None;;
Un seul point-virgule suffit.
Et enfin, pour répondre à la question tant attendue :
Dans un premier temps, tu dois être capable à partir du couple (i,j) de déterminer le sous-carré avec de simples opérations arithmétiques. Ensuite, il te restera à vérifier que ta variable "k" n'est pas présente dans la ligne i, dans la colonne j et dans le sous-carré.
//colonne
for(int x=0;x<9;x++)
if ( enonce[x][j] == k) return false;
//ligne
for(int y=0;y<9;y++)
if ( enonce[i][y] == k) return false;
//sous-carré :
// i / 3 * 3=> l'indice minimale de la ligne du sous-carré
// j / 3 * 3=> l'indice minimale de la colonne du sous-carré
for(int x = i / 3 * 3; x < i / 3 * 3 + 3; x++)
for(int y = j / 3 * 3; y < j / 3 * 3 + 3; y++)
if ( enonce[x][y] == k) return false;
return true;
Si tu as des questions, n'hésite pas.
Cdlt