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.
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.
Partager