Programmation Sudoku.c + ez-draw

Fermé
ceto13 Messages postés 7 Date d'inscription lundi 26 mai 2008 Statut Membre Dernière intervention 17 septembre 2012 - 10 avril 2009 à 15:39
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 1 mai 2009 à 02:41
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 :

#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:

3 réponses

ceto13 Messages postés 7 Date d'inscription lundi 26 mai 2008 Statut Membre Dernière intervention 17 septembre 2012
11 avril 2009 à 18:19
Personne ne pourrais m'aider?
0
L1 IM luminy ?

Il semblerait qu'on ait eu la même idée ...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
1 mai 2009 à 02:41
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é.

//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
0