IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Résoudre grille de Sudoku


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Points : 48
    Points
    48
    Par défaut Résoudre grille de Sudoku
    Bonjour,

    Voilà, j'ai écris un petit programme (pas encore finis) qui résoud une grille de Sudoku incomplète rentrée par l'utilisateur.
    Mais j'ai 2-3 problèmes

    En effet j'ai une fonction GenerateGrille qui remplit les cases vides en vérifiant si le nombre ne se trouve pas dans la ligne et la colonne mais je ne sais pas comment faire pour vérifier si il est dans le carré ?? Car sans ça la grille affichée contient toujours des cases vides.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    						   /*****************************************************/
    						   /*	          FONCTION : RESOUD LA GRILLE           */
    						   /*****************************************************/
     
    void GenerateGrille(int grille[][taille])
    {
        int ligne, colonne, nb;
     
        for(ligne = 0; ligne < taille; ligne++) // Parcourt les lignes du tableau                      
    	{
            for(colonne = 0; colonne < taille; colonne++) // Parcourt les colonnes du tableau                  
    		{
                if (grille[ligne][colonne] == 0) // Si la case est vide...                             
                {
                    for (nb = 1; nb <= taille; nb++) // On remplit la grille avec un nombre de 1 à 9          
                    {
    					if(Colonne(grille, nb, ligne, colonne) != false && Ligne(grille, nb, ligne, colonne) != false) // Vérifie que le nombre n'est pas déjà dans la ligne ou la colonne
    					{
    						grille[ligne][colonne] = nb; // La case reçoit le nombre
    						nb = taille + 1; // Pour sortir de la boucle
    					}
    				}
    			}
    		}
    	}
    }
     
    bool Ligne(int grille[][taille], int nb, int ligne, int colonne)
    {
    	int j;
    	bool trouve;
     
    	trouve = true;
     
    	for(j=0; j<taille; j++)
    	{
    		if(nb == grille[ligne][j])
    		{
    			if(j != colonne)
    			{
    				trouve = false;
    				j = taille;
    			}
    		}
    	}
     
    	return(trouve);
    }
     
    bool Colonne(int grille[][taille], int nb, int ligne, int colonne)
    {
    	int i;
    	bool trouve;
     
    	trouve = true;
     
    	for(i=0; i<taille; i++)
    	{
    		if(nb == grille[i][colonne])
    		{
    			if(i != ligne)
    			{
    				trouve = false;
    				i = taille;
    			}
    		}
    	}
     
    	return(trouve);
    }
    Si vous pouviez m'éclairer

    Merci

    Bonne journée

  2. #2
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 89
    Points : 91
    Points
    91
    Par défaut
    Ce n'est pas une question de C.

    Ton problème est de savoir à quel carré appartient une case déterminée par un couple (ligne, colonne). Si tu fais un dessin, tu remarqueras que toutes les cases d'un même carré ont un point commun. Prends par exemple les cases du premier carré (en haut à gauche), tu as :
    ligne / 3 = 0
    colonne % 3 = 0

    Pour le deuxième carré :
    ligne / 3 = 0
    colonne % 3 = 1

    etc...

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    C'est une question de maths plutôt qu'autre chose, c'est l'utilisation conjointe de mod et div comme l'a dit ciol2.6.12.
    A partir d'une case (i,j) il faut que tu trouve le carré correspondant (cligne,ccolonne) et inversement, à partir du carré (cligne, ccolonne) tu puisses parcourir toutes ses cases.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    Trap D a tout dit!

    Notations: les carrés ont pour coordonnés (k,l) ou 1<=k,l<=3, les cases ont pour coordonnés (i,j) où 1<=i,j<=9

    A une case (i,j) son carré est ((i-1)/3 +1,(j-1)/3 +1) où / est la division entière
    A un carré (k,l) ses cases sont (i,j) oû 3*(k-1)+1<=i<=3*k et 3*(l-1)+1<=j<=3*l
    Nemerle, mathématicopilier de bars, membre du triumvirat du CSTM, 3/4 centre

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Merci pour m'avoir mis sur la voie.
    J'avais oublier à quel point un dessin peut vous faire comprendre des choses

    La résolution tourne comme une horloge

    A++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. afficher une grille de sudoku Swing
    Par herbert8 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 03/10/2007, 00h42
  2. Comment résoudre une grille de Sudoku ?
    Par tarik_12 dans le forum Pascal
    Réponses: 1
    Dernier message: 25/04/2007, 20h31
  3. [VB6]Afficher une grille de Sudoku
    Par epaminondas dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 07/03/2006, 17h36
  4. Dessiner un grille de sudoku
    Par etranger dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 17/02/2006, 09h24
  5. générer grille de sudoku sans disjoncteur
    Par javatwister dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/12/2005, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo