Programmation Sudoku.c + ez-draw

ceto13 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 441 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 :

#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..........
}
Configuration: Windows Vista
Firefox 3.0.8


Merci d'avance pour votre aide

3 réponses

  1. ceto13 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
     
    Personne ne pourrais m'aider?
    0
  2. lol
     
    L1 IM luminy ?

    Il semblerait qu'on ait eu la même idée ...
    0
  3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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