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 :

Probleme avec un Sudoku


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 302
    Par défaut Probleme avec un Sudoku
    Bonjour,
    Voila j'ai un sudoku a creer et dès le début je bloque. Mes connaissances en C sont moyennes dira t-on... Donc voila j'ai reussi a créer mon tableau de 9 cases sur 9 et mon probleme arrive des que je dois remplir aléatoirement mon tableau. Donc voila ce que j'ai fait :
    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
    #include <stdio.h>
    #define N 9
    #define OUI 1
    #define NON 0
     
    void afficherGrille(int S[N][N]);
    int main(){
        int grille[N][N];
        afficherGrille(grille);
    }
     
    void afficherGrille(int S[N][N]){
        int indiceColonne;
        int indiceLigne;
        int entier;
        entier = (srand()%N);
        printf("-------------");
        for(indiceLigne = 0 ; indiceLigne < N ; indiceLigne++){
            if((indiceLigne) == 3 ){
                printf("\n --- --- --- ",S[indiceLigne][indiceColonne]);
            }else if((indiceLigne) == 6){
                printf("\n --- --- --- ",S[indiceLigne][indiceColonne]);
            }
            printf("\n");
            for(indiceColonne = 0 ; indiceColonne < N ; indiceColonne++){
                if((indiceColonne%3) == 0){
                    printf("|%d",entier,S[indiceLigne][indiceColonne]);
                }else if((indiceColonne) == 8){
                    printf("%d|",entier,S[indiceLigne][indiceColonne]);
                }else{
                    printf("%d",entier,S[indiceLigne][indiceColonne]);
                }
     
            }
        }
    }
    Cependant mon entier retourné est toujours le meme. Donc je ne sais pas si il faut creer une fonction a part pour remplir mes cases ou s'il faut faire comme je fais?
    Merci

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le générateur de nombres aléatoires ne fonctionne pas comme ça
    srand() initialise le générateur : à utiliser une seule fois au début du programme
    utiliser ensuite rand() pour obtenir les nombres aléatoires à chaque fois qu'on en veut un nouveau

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 302
    Par défaut
    Donc comment faire? Desolé mais je ne comprends pas trop. Enfin j'ai compris qu'il faut utiliser rand() apres avoir initialiser grace a srand() mais je ne vois pas quel parametre prendre.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    typiquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(void)
    {
    ...
       srand((unsigned) time(NULL))
    ...
      i = rand(); // donne un nombre aléatoire entre 0 et RAND_MAX

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par kev484 Voir le message
    Donc comment faire? Desolé mais je ne comprends pas trop. Enfin j'ai compris qu'il faut utiliser rand() apres avoir initialiser grace a srand() mais je ne vois pas quel parametre prendre.
    Pour générer un nombre pseudo-aléatoire entre 0 et un entier N, tu dois:
    1. Initialiser ton générateur en appelant srand() au début de ton programme (généralement, on appelle cette fonction une fois au début de la fonction main()).
    2. Utiliser une des solutions proposées dans la FAQ C: http://c.developpez.com/faq/?page=no..._random_bornes

    Et le tour est joué! Bonne chance

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 302
    Par défaut
    Ok donc a chaque fois que je lance mon programme j'ai bien un nombre aléatoire créé mais maintenant je souhaiterai que dans chaque case , il soit différent. Voila mes modifs :
    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
    #include <stdio.h>
    #define N 9
    #define OUI 1
    #define NON 0
     
    void afficherGrille(int S[N][N]);
    int main(){
        int grille[N][N];
        srand((int)time(NULL));
        afficherGrille(grille);
    }
     
    void afficherGrille(int S[N][N]){
        int indiceColonne;
        int indiceLigne;
        int entier;
        entier = rand()%N+1;
        printf("-------------");
        for(indiceLigne = 0 ; indiceLigne < N ; indiceLigne++){
            if((indiceLigne) == 3 ){
                printf("\n --- --- --- ",S[indiceLigne][indiceColonne]);
            }else if((indiceLigne) == 6){
                printf("\n --- --- --- ",S[indiceLigne][indiceColonne]);
            }
            printf("\n");
            for(indiceColonne = 0 ; indiceColonne < N ; indiceColonne++){
                if((indiceColonne%3) == 0){
                    printf("|%d",entier,S[indiceLigne][indiceColonne]);
                }else if((indiceColonne) == 8){
                    printf("%d|",entier,S[indiceLigne][indiceColonne]);
                }else{
                    printf("%d",entier,S[indiceLigne][indiceColonne]);
                }
     
            }
        }
    }
    Dois-je creer une procédure qui permet de mettre un chiffre aléatoire dans chaque case ou puis-je le faire directement dans ma fonction permettant d'afficher ma grille?

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Pour tirer aléatoirement n nombres parmi N, sans répétition, la méthode que j'utilise est de prendre un tableau de taille N contenant les nombres en question, de le mélanger (shuffle), puis de prendre les n premiers nombres du tableau mélangé.

    Voici un exemple:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #define ARRAY_SIZE(arr) ( sizeof (arr) / sizeof *(arr) )
     
    /* -tc- Voir: http://c.developpez.com/faq/?page=nombres#NOMBRES_random_bornes */
    int alea(int n)
    {
       int partSize   = (n == RAND_MAX) ? 1 : 1 + (RAND_MAX - n)/(n+1);
       int maxUsefull = partSize * n + (partSize-1);
       int draw;
     
       do
       {
          draw = rand();
       } while (draw > maxUsefull);
       return draw/partSize;
    }
     
    /* -tc- Utilise l'algorithme de Fisher & Yates */
    int shuffle(int *a, size_t size_a)
    {
        int err = 0;
     
        if (a != NULL && size_a > 1)
        {
            size_t n = size_a;
     
            while (--n > 0)
            {
                /* -tc- k est un entier aleatoire entre 0 et n */
                size_t k = alea(n);
     
                if (k != n)
                {
                    /* -tc- On echange le k-eme et le n-eme element */
                    int tmp = a[n];
                    a[n] = a[k];
                    a[k] = tmp;
                }
            }
        }
        else
        {
            /* Erreur: argument invalide */
            err = 1;
        }
        return err;
    }
     
    /* -tc- Dans ce programme, on desire afficher aleatoirement 5 nombres parmi
       l'ensemble {0,1,2,3,4,5,6,7,8,9} sans repetition */
    int main(void)
    {
        int nombres[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        size_t n = 5;
        size_t i;
     
        srand(time(NULL));
        shuffle(nombres, ARRAY_SIZE(nombres));
     
        for (i = 0; i < ARRAY_SIZE(nombres) && i < n; i++)
        {
            printf("%d ", nombres[i]);
        }
        printf("\n");
     
        return 0;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

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

Discussions similaires

  1. Probleme avec le solveur SuDoKu
    Par DeViLGoRe dans le forum C
    Réponses: 2
    Dernier message: 14/01/2008, 22h28
  2. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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