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 :

fonction recursive pour la configuration du jeu futoshiki


Sujet :

C

  1. #1
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Par défaut fonction recursive qui donne boucle infini
    Dans le cadre d'un compte rendu je dois ecrire un programme en langage C qui donnee la configuration initiale du jeu japonais Futoshiki, resoud le jeux en affichant la configuration finale.
    futoshiki est un puzzle japonais dans lequel une matrice carre n.n doit etre remplie par les chiffres de 1 a n respectant les deux regles suivantes.
    -sur chaque ligne et chaque colonne il ne doit pas y avoir une repetition de aucun numero.
    -si entre deux cases adjacentes il y a un signe d'inegalite, ce signe doit etre respecte.
    voila un exemple.

    fichier IN:
    5
    0 | 0 | 0 | 0 | 0
    - - - - v - - - -
    0 > 0 | 0 | 0 | 3
    - - - - - - - - -
    0 | 0 < 2 | 0 | 0
    - - - - v - - - -
    0 | 0 | 0 | 0 | 4
    ^ - ^ - - - - - - 
    0 | 0 | 0 | 0 | 0
    fichier out
    5
    1 | 4 | 5 | 3 | 2
    - - - - v - - - -
    5 > 2 | 4 | 1 | 3
    - - - - - - - - -
    3 | 1 < 2 | 4 | 5
    - - - - v - - - -
    2 | 3 | 1 | 5 | 4
    ^ - ^ - - - - - - 
    4 | 5 | 3 | 2 | 1
    j'ai resolu tout mais quand je fais une fonction recursive pour trouver la solution ca me donne une boucle infinie je ne sais pas prk.
    voici le code.

    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
    int trovare_soluzione(shiki ** t, int n, int f)
    {
        int i, j, r;
        int s = n / 2 + 1;
        if (f == 0)
    	return (configuration_check(t, n));
        for (i = 0; i <= n; i++) {
    	for (j = 0; j <= n; j++) {
    	    if (isdigit(t[i][j].num) && t[i][j].flag == -1) {
    		for (r = 1; r <= s; r++) {
    		    t[i][j].num = r + '0';
    		    t[i][j].flag = 1;
    		    if (trovare_soluzione(t, n, f - 1) == 1) {
    			return (1);
    		    }
    //backtrack
    		    t[i][j].flag = -1;
    		}
    	    }
    	}
        }
        return 0;
    }
    shiki est une structure de donnees qui contient deux champs. le champs num pour memoriser les caracteres lits du fichier in ( a l'exception des tabulations) et un champ flag ( se flag=-1 veut dire que qu'on doit inserer un num se flag=1 ca veut dire que le numero a ete deja trouve)
    la fonction configuration_check est une focntion qui verifie a chaque fois si les regles du jeu sont respectes elle retourne 1 si elles sont respectees 0 sinon.

    merci d'avance de votre aide.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Si boucle infinie, alors ta condition d'arrêt de récursivité n'est jamais vraie.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    ta boucle est infinie parce que tu rappelles la fonction DANS la boucle..

    Il faut que tu mettes un flag qui indique que tu dois rappeler et que tu sortes des boucles..

  4. #4
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Par défaut
    je crois que la condition darret est juste.
    Mr Souviron est ce que vous expliquer plus en details, ou dois+je introduire les flags? merci bcp pour vos reponses

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    je ne sais pas ce que tu veux faire, mais quand tu fais :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        for (i = 0; i <= n; i++) {
    	for (j = 0; j <= n; j++) {
    	    if (isdigit(t[i][j].num) && t[i][j].flag == -1) {
    		for (r = 1; r <= s; r++) {
    		    t[i][j].num = r + '0';
    		    t[i][j].flag = 1;
    		    if (trovare_soluzione(t, n, f - 1) == 1) {
    			return (1);
    		    }

    • Si ta fonction ne retourne pas 1, tu boucles sur tous les i, tous les j, tous les r

    • Si ta fonction retourne 1, tu continues à boucler sur les i et j suivants à l'étape du dessus

    • Enfin, on ne sait pas avec quoi tu as initilaisé, et tu testes en entrée de boucle avec -1 : es-tu sûr d'avoir initialisé tout à -1 ??

  6. #6
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Par défaut fonction recursive pour la configuration du jeu futoshiki
    j'ai modifie la condition d'arret mais ma fonction n'affiche pas la configuration juste.
    voila ma fonction modifiee
    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
     
    int trovare_soluzione(shiki **t, int riga, int colonna,int n){
    int i,k,j,trovato=0,s;
    s=n/2+1;
    if(riga==n && colonna==n ){// condition d'arret apres avoir parcouru toute la matrice je verifie si la conifguration exacte respectes les regles
    if(configuration_check(t,n)==1)
    return 1;
    else return 0;
    }
    if(t[riga][colonna].num=='0'){// je controle si l'element est egale a 0 donc je dois inserer un numero different de 0;
    trovato=0;
    for(i=1;i<=s;i++){  // les valeurs possibles a inserer
    for(k=0;k<=n;k++){
    if(isdigit(t[riga][k].num) && t[riga][k].flag==1 &&k!=colonna){
    if(t[riga][k].num==i+'0')  // je controle si la valeur a inserer ne se trouve pas deja dans la ligne
    trovato=1;
    }}
    if(trovato==0){
    for(j=0;j<=n;j++){
    if(isdigit(t[j][colonna].num) && t[j][colonna].flag==1 &&j!=riga){
    if(t[j][colonna].num==i+'0') // je controle si la valeur a inserer ne se trouve pas deja dans la colonne
    trovato=1;
    }}
    if(trovato==0){  // si je ne le trouve pas j'insere un numero
    t[riga][colonna].flag=1;
    t[riga][colonna].num=i+'0';
    colonna++; // j'incremente le num de colonne
    if(colonna==n){ 
        riga++;
        colonna=0;}
        if(trovare_soluzione(t,riga,colonna,n))return 1;// j'appelle ma methode recursive
        //backtrack
        t[riga][colonna].flag=-1;
    t[riga][colonna].num='0';
    }}}}
    return 0;
     
    }
    merci d'avance de votre aide

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Déjà un formatage s'impose, c'est illisible...

    Code C : 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
     
    int trovare_soluzione (shiki **t, int riga, int colonna,int n)
    {
    int i,k,j,trovato=0,s;
     
    s=n/2+1;
    if ( riga==0 && colonna==0 )
      {
         // condition d'arret apres avoir parcouru toute la matrice je verifie si la conifguration exacte respectes les regles
         if ( configuration_check(t,n)==1 )
             return 1;
         else 
             return 0;
      }
     
    if ( t[riga][colonna].num=='0' )
      {
         // je controle si l'element est egale a 0 donc je dois inserer un numero different de 0;
         trovato=0;
         for ( i=1 ; i<=s; i++)
           {
             // les valeurs possibles a inserer
             for ( k=0; k<=n; k++ )
               {
                  if ( isdigit(t[riga][k].num) && t[riga][k].flag==1 && k!=colonna )
                   {
                       if ( t[riga][k].num==i+'0' )  // je controle si la valeur a inserer ne se trouve pas deja dans la ligne
                         trovato=1;
                   }
               }
     
             if ( trovato==0 )
              {
                 for ( j=0; j<=n; j++ )
                   {
                     if ( isdigit(t[j][colonna].num) && t[j][colonna].flag==1 && j!=riga )
                      {
                         if ( t[j][colonna].num==i+'0' ) // je controle si la valeur a inserer ne se trouve pas deja dans la colonne
                           trovato=1;
                       }
                   }
     
                 if ( trovato==0 )
                  { 
                      // si je ne le trouve pas j'insere un numero
                      t[riga][colonna].flag=1;
                      t[riga][colonna].num=i+'0';
                      colonna++; // j'incremente le num de colonne
     
                      if ( colonna==n )
                       { 
                          riga++;
                          colonna=0;
                       }
     
                      if ( trovare_soluzione(t,riga,colonna,n) )
                        return 1;// j'appelle ma methode recursive
     
                      //backtrack
                      t[riga][colonna].flag=-1;
                      t[riga][colonna].num='0';
                   }
               }
            }
        }
     
    return 0;
    }

    Maintenant, est-ce ça que tu veux ?


    D'autre part, dans la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( riga==0 && colonna==0 )
    toi tu as mis le caractère o et non pas 0 ..

  8. #8
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut l'esprit de l'escalier
    j'y ai pensé tout de suite en lisant le premier post, puis ...
    mais pourquoi vouloir écrire une fonction récursive pour une situation aussi simpliste (futoshiki, sudoku ...) : une douzaine d'états et très peu de contraintes. c'est un problème des 8 reines (un peu plus lourd) qui peut être résolu en une centaine de lignes.
    le seul avantage que je trouve à une écriture récursive est la facilité de (re)lecture quand les conditions de retour sont claires.

    A+

Discussions similaires

  1. Fonction recursive pour un arbre
    Par sabotage dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2008, 09h54
  2. [Fonction](recursive) Problème pour dresser un arbre
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 21/11/2006, 13h35
  3. Fonction tir() pour jeu
    Par ironzorg dans le forum SDL
    Réponses: 7
    Dernier message: 18/11/2006, 13h16
  4. Une déclaration pour la survie du jeu vidéo en France
    Par Freakazoid dans le forum DirectX
    Réponses: 1
    Dernier message: 30/10/2002, 14h31
  5. Réponses: 3
    Dernier message: 02/09/2002, 18h49

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