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

 C Discussion :

je suis bloqué


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Par défaut je suis bloqué
    comme je suis nouveau sur le site alors bonjour tout le monde...

    en fait je débute en C et je m'essaye à des petits exercices histoire de progresser. Mais là je suis bloqué.
    Mon exercice consiste à créer un tableau style sudoku. Mon tableau s'affiche bien et au niveau des lignes j'arrive bien à n'avoir qu'une seule fois un nombre. Mais au niveau des colonnes je n'y arrive pas. Après maintes tentatives, je ne vois pas où et comment insérer les lignes de programme qui me permettraient de le faire.
    Aussi je vous demande des conseils et un peu d'aide. Voici mon programme:

    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
    #include <stdlib.h> 
    #include <time.h> 
    #include <stdio.h>
     
     
    int main(void){ 
    int grille[9][9]={0}; //déclaration de la grille + mise à zéro
     
    //Pour la génération des nombres aléatoires 
    srand((unsigned int)time(NULL));
     
    //Les limites pour le tirage au sort 
    int max = 9;
    int min = 1;
    bool nombre_ok;
     
    //Pour la sélection du nombre de la grille 
     
    for(int i=0; i<9; i++){
    	for(int j=0; j<9; j++){
    		do{
    			nombre_ok = true; 
    			grille[i][j] = (rand() % (max - min + 1)) + min;
    			for(int k=0; k<9; k++){
    				if (k!=j){
    					if(grille[i][k] == grille[i][j]){ 
    						nombre_ok = false;
    					}
    				}
     
                    if (k!=j){
                        if(grille[j][k] == grille[i][j]){
                            nombre_ok = false;
                            }    							
    			}							
    			}
    		}while (!nombre_ok);
    	} 
    }
     
    for(int v=0; v<9;v++){
    	for(int h=0; h<9; h++){ 
    		printf("%d ", grille[v][h]); 
    			} 
    	printf("\n"); 
    }
    system("pause");
    }
    Merci par avance à toutes et à tous.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 8
    Par défaut
    Salut,

    En lisant ton code, j'avoue que je ne comprend pas l'utilité du second "if(k!=j)"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     if (k!=j){
                        if(grille[j][k] == grille[i][j]){
                            nombre_ok = false;
                            }    							
    			}							
    			}
    Ce n'est pas très optimisé mais à la place de ce if, je refaire un boucle sur les colonnes comme tu l'as fais sur les lignes.

    En gros, tu recopies ta boucle sur k en remplaçant j par i et en faisant attention au sens de tes indices c'est à dire il faut faire le test "if(grille[k][i] == grille[i][j])"
    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
     
    for(int i=0; i<9; i++){
    	for(int j=0; j<9; j++){
    		do{
    			nombre_ok = true; 
    			grille[i][j] = (rand() % (max - min + 1)) + min;
    			for(int k=0; k<9; k++){
    				if (k!=j){
    					if(grille[i][k] == grille[i][j]){ 
    						nombre_ok = false;
    					}
    				}
     
       for(int k=0; k<9; k++){
    				if (k!=i){
    					if(grille[k][j] == grille[i][j]){ 
    						nombre_ok = false;
    					}
    				}
    		}while (!nombre_ok);
    	} 
    }
    Après, lorsque çà marche tu peux chercher à optimiser code en mettant des points d'arrêts. Dans ce cas c'est rapide et pas très lourd mais lorsqu'il y a trop de boucle çà peut devenir très lourd

    Bon courage...

  3. #3
    Membre chevronné Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Par défaut
    Ma première impression est que ce code ne marchera pas pour créer une grille de sudoku. En effet, tu remplis ta grille ligne par ligne en chiffre aléatoire : tu pourras donc avoir sur toutes tes lignes les chiffres de 1 à 9 mais ca ne marchera pas (ou alors coup de chance) pour que les colonnes aussi ne contiennent que des chiffres de 1 à 9 de façon unique.

    Créer une grille de sudoku demande plus de reflexion au niveau algo...

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Par défaut merci.... mais....
    Citation Envoyé par mapao Voir le message
    Salut,

    En lisant ton code, j'avoue que je ne comprend pas l'utilité du second "if(k!=j)"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     if (k!=j){
                        if(grille[j][k] == grille[i][j]){
                            nombre_ok = false;
                            }    							
    			}							
    			}
    Ce n'est pas très optimisé mais à la place de ce if, je refaire un boucle sur les colonnes comme tu l'as fais sur les lignes.

    En gros, tu recopies ta boucle sur k en remplaçant j par i et en faisant attention au sens de tes indices c'est à dire il faut faire le test "if(grille[k][i] == grille[i][j])"
    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
     
    for(int i=0; i<9; i++){
    	for(int j=0; j<9; j++){
    		do{
    			nombre_ok = true; 
    			grille[i][j] = (rand() % (max - min + 1)) + min;
    			for(int k=0; k<9; k++){
    				if (k!=j){
    					if(grille[i][k] == grille[i][j]){ 
    						nombre_ok = false;
    					}
    				}
     
       for(int k=0; k<9; k++){
    				if (k!=i){
    					if(grille[k][j] == grille[i][j]){ 
    						nombre_ok = false;
    					}
    				}
    		}while (!nombre_ok);
    	} 
    }
    Après, lorsque çà marche tu peux chercher à optimiser code en mettant des points d'arrêts. Dans ce cas c'est rapide et pas très lourd mais lorsqu'il y a trop de boucle çà peut devenir très lourd

    Bon courage...
    merci pour ta réponse mapao...

    j'ai corrigé mon code et j'ai refais ma boucle mais au final il n'y a que les lignes qui sont contrôlées et pas les colonnes.

Discussions similaires

  1. Probleme avec quelque tableaux (je suis bloqué)
    Par Jeol2007 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 04/08/2010, 23h42
  2. Je suis bloqué dans un exercice. GridBagLayout et gbConstraints, panels.
    Par CosaNostra dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 17/02/2010, 09h23
  3. [PORTEE VARIABLES] Demande conseil je suis bloqué
    Par PoZZyX dans le forum Langage
    Réponses: 18
    Dernier message: 29/03/2006, 09h48

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