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 -
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).
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).
A voir également:
- Tour de hanoi programme c
- Programme demarrage windows - Guide
- Comment réinitialiser une tour d'ordinateur - Guide
- Mettre en veille un programme - Guide
- Message programmé iphone - Guide
- Programme word gratuit - Guide
6 réponses
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?
#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?
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,
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,
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,
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,
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;
}
#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;
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
#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");
}
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");
}