Tour de hanoi avec les pile (stack) langage C

Résolu
ghostdz -  
hamzastar7 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -
J'ai besoin d'aide pour résoudre cet travaille

Il s'agit d'un jeu de réflexion dont voici le principe. Des anneaux de diamètres
différents sont empilés sur un poteau. Un anneau peut être empilé sur un autre seulement
si il a un diamètre inférieur à celui de l'anneau sur lequel il repose.

Le but du jeu est de déplacer n anneaux initialement empilés sur un seul poteau vers un
autre en respectant les règles du jeu et en n'utilisant qu'un seul poteau intermédiaire.

Ecrire un programme qui permette d'afficher les étapes nécessaires pour le déplacement
de n anneaux d'un poteau A vers un poteau C en passant par le poteau intermédiaire B en
utilisant les piles (stack).

6 réponses

ghostdz
 
bon la solution sans l utilsation les piles est


#include<stdio.h>
#include<conio.h>
#include<math.h>
void hanoi(int x, char from,char to,char aux)
{

if(x==1)
{
printf("Move Disk From %c to %c\n",from,to);
}
else
{
hanoi(x-1,from,aux,to);
printf("Move Disk From %c to %c\n",from,to);
hanoi(x-1,aux,to,from);
}

}
void main()
{
int disk;
int moves;

printf("Enter the number of disks you want to play with:");
scanf("%d",&disk);
moves=pow(2,disk)-1;
printf("\nThe No of moves required is=%d \n",moves);
hanoi(disk,'A','C','B');
getch();
}

comment utilse les piles dans la solution?
7
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Si tu pouvais éviter les points d'interrogation, ça serait sympa...
On aide à titre gratuit.
En plus, tu nous aides vraiment pas, ton code n'est pas indenté. Pour la lisibilité, il est conseillé de poster le code dans tes balises "code" (à droite du bouton souligné).
Ensuite, tu pourrais nous préciser ce qui ne marche pas dans le code ? Erreur à la compilation ? Si oui, quelle ligne ?
Etc.
Cdlt,
3
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,

Il faut voir les piles comme une partie de la mémoire où tu peux stocker tes anneaux et les reprendre dans le sens inverses exactement comme si tu jouais à la tour de Hanoï. Il faut donc 3 piles. Il te faut déjà implémenter les fonctionnalités classiques des piles (ajouter(), retirer(), ...).

cdlt,
2
ghostdz
 
alors ou est le probleme dans cet code


#include <stdio.h>
#include <stdlib.h>
#define FROM TO USE 1
#define MAXELEMENTS 10
typedef struct {
int A[MAXELEMENTS];
int top;
char name;
}STACK;

void initStack(STACK *S);
int pop(STACK *S);
void push(STACK *S, int x);
void hanoi(int n, STACK* from, STACK* to, STACK* use);
void printStack(STACK S);

STACK S1,S2,S3;
int main (int argc, char **argv){
int n=1;

S1.name='A';S2.name='B';S3.name='C';
initStack(&S1);printStack(S1);
initStack(&S2);printStack(S2);
initStack(&S3);printStack(S3);

hanoi(n, &S1, &S3, &S2);

getchar();
return 0;

}
void hanoi(int n, STACK* from, STACK* to, STACK* use){

int x;
if(n==1)
{
//printf("\n%c --> %c",from->name,to->name);
x=pop(from);push(to,x);
printStack(S1);printStack(S2);printStack(S3);printf("\n");
return;
}
if (n > 0) {
hanoi(n-1, from, use, to);
//printf ("\n%c --> %c", from->name,to->name);
x=pop(from);push(to,x);
printStack(S1);printStack(S2);printStack(S3);printf("\n");
hanoi(n-1, use, to, from);
}
}
void printStack(STACK S){
int i;
printf("\n%c:",S.name);
for(i=0;i<=S.top;i++) printf("%d ",S.A[i]);
}

void initStack(STACK *S){
int i;
S->top=-1;
for(i=0; i<MAXELEMENTS; i++)
S->A[i]=i+1;
}
int pop(STACK *S){
int element;
if (S->top==-1) return 0;

element=S->A[S->top];
S->top--;
return element;
}
void push(STACK *S, int x){

if (S->top==MAXELEMENTS-1) {printf("\full stack!");return;}

S->top++;
S->A[S->top] = x;
}
0
ghostdz
 
est ce que il y a une solution???
0
ghostdz
 
???????????
2

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ghostdz
 
??????????????
1
hamzastar7 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
#include<stdio.h>
void afich(int v[],int vv[],int vvv[],int n,FILE *sss){
int i;
for(i=1;i<=n;i++){
printf(" %2d ",v[i]);printf(" %2d ",vv[i]);printf(" %2d ",vvv[i]);
fprintf(sss," %3d ",v[i]);
fprintf(sss," %3d ",vv[i]);
fprintf(sss," %3d ",vvv[i]);
printf("\n");
fprintf(sss,"\n");
}
printf("\n");fprintf(sss,"\n");
}
void deplac(int x,int a[],int b[],int c[],FILE *f){
if(x==1){
b[1]=a[1];
a[1]=0;
afich(a,b,c,x,f);
}
else{
deplac(x-1,a,c,b,f);
c[x]=a[x];
a[x]=0;
deplac(x-1,b,a,c,f);
afich(a,b,c,x,f);
}
}
int main(){
int a[64],b[64],c[64],i,n;
printf("Donner le nombre de discs ");
scanf("%d",&n);
for(i=0;i<=n;i++){
a[i]=i;b[i]=0;c[i]=0;
}
char nm[20];
printf("Entrer le nom de fichier a creer ");
scanf("%s",nm);
FILE *in;
in=fopen(nm,"a");
if(in==NULL)puts("Errure!!!");
afich(a,b,c,n,in);
deplac(n,a,b,c,in);
puts("Salam");
}
0