Maison >tutoriels informatiques >connaissances en informatique >Comment écrire un programme en langage C pour résoudre le problème de la Tour de Hanoï
En fait, il y a trois étapes principales :
Tout d’abord, déplacez les n-1 disques de a à b en passant par c.
Deuxièmement, déplacez le disque inférieur de a vers c.
Troisièmement, puisque les n-1 premières plaques sont toutes sur le pilier b, il suffit de traiter le pilier b comme le pilier a et de répéter les étapes ci-dessus.
#inclure
Découvrons comment résoudre le puzzle. Pendant le puzzle, nous pouvons utiliser une fonction pour déplacer la plaque. Le prototype de la fonction est "void move(int n, char a, char b, char c)". A l'intérieur de la fonction, nous pouvons utiliser des méthodes récursives pour déplacer la plaque. En précisant le nombre de plaques n et les identifiants des trois piliers a, b, c, on peut déplacer les plaques du pilier a au pilier c en séquence. L'idée de récursion
{
si(n==1)
printf("t%c->%cn", a, c); // Lorsqu'il n'y a qu'une seule plaque, déplacez la plaque directement de a à c
autre
{
Afin d'aider les joueurs qui n'ont pas encore réussi le niveau, découvrons les méthodes spécifiques de résolution d'énigmes. Dans le processus de résolution d'énigmes, nous pouvons utiliser des méthodes récursives. Les opérations spécifiques sont les suivantes : 1. Déplacez la n-1ème plaque du pilier a au pilier c : move(n-1, a, c, b) ; 2. Déplacez la nième plaque du pilier a au pilier b ; 3. Place n
Pour aider les joueurs qui n'ont pas encore résolu le puzzle, nous pouvons utiliser le code suivant pour résoudre le problème : printf("t%c->%cn",a,c);
Afin d'aider les joueurs qui n'ont pas encore dépassé ce niveau, jetons un coup d'œil aux étapes spécifiques pour résoudre l'énigme. Tout d’abord, nous pouvons déplacer les n-1 premières plaques de la colonne B vers la colonne A, de sorte que la colonne B devienne la colonne de départ, puis déplacer les plaques de la colonne B vers la colonne C en passant par la colonne A.
}
}
int main()
{
int n;
printf ("Veuillez entrer le nombre de blocs à déplacer :"
);scanf("%d",&n);
move(n,'a','b','c');
retour 0;
}
Je l'ai fait hier.
#include
void main() { entier m; printf("Veuillez entrer le nombre d'étages de la tour :"); scanf("%d",&m); printf("Veuillez suivre ces étapes : n"); hanoi(m,'1','2','3'); }
void hanoi(int n,char one,char two,char three) { void move(char x,char y); if(n==1) move(one,trois else { hanoi(n-1,one); ,trois,deux); move(un,trois); hanoi(n-1,deux,un,trois } }
);Je vais partager avec vous une fonction de mouvement simple qui peut vous aider à effectuer des opérations de mouvement dans le jeu. La fonction est la suivante : void move(char x, char y) { printf("%c--->%cn", x, y); } Cette fonction accepte deux paramètres, représentant la position actuelle et la position cible. Il imprimera le processus de déplacement afin que vous puissiez suivre le chemin de déplacement. Vous pouvez appeler cette fonction pour effectuer des opérations de mouvement selon vos besoins. J'espère que cette fonction pourra vous aider à passer le niveau !
Vous pouvez lire les commentaires ici :
Mon programme ci-dessous :
Vous trouverez ci-dessous une fonction pour vous aider à résoudre le puzzle, elle peut être utilisée pour déplacer le sous-bloc supérieur d'une tour à l'autre. ```C++ void NuoYiWei(int FromTa, int ToTa) { //Écrivez votre code ici pour déplacer le sous-bloc supérieur de FromTa vers ToTa. } ``` Vous pouvez opérer sur la base de cette fonction et écrire votre méthode de résolution d'énigmes selon des règles de jeu spécifiques et des exigences d'énigme. N'oubliez pas de vous baser sur la réalité
{
TopPoint[FromTa] est un tableau qui enregistre la hauteur de chaque niveau de la tour. Lorsqu'un élément est retiré d'une tour, la hauteur de la tour est réduite d'une unité. Le but de ce tableau est de nous aider à suivre la hauteur actuelle de chaque tour.
Pour résoudre ce problème, nous pouvons utiliser le code suivant pour enregistrer les données de trois tours et déplacer les données d'une tour à l'autre : ```python DuiZhan[ToTa][TopPoint[ToTa]] = DuiZhan[FromTa][TopPoint[FromTa]] ``` Cette ligne de code prendra les données du haut de la tour déplacée (FromTa) et les transférera vers le haut de la tour déplacée (ToTa). De cette façon, nous pouvons enregistrer et déplacer des données sur la tour.
DuiZhan[FromTa][TopPoint[FromTa]] = 0; //Restaurer le niveau supérieur de la tour d'origine pour qu'il soit vide. Jetons maintenant un coup d'œil aux méthodes spécifiques de résolution d'énigmes pour aider les joueurs qui n'ont pas encore réussi le niveau.
Afin d'aider les joueurs qui n'ont pas encore réussi le niveau, découvrons les méthodes spécifiques de résolution d'énigmes. L'une des étapes clés consiste à déplacer la tour vers la position cible. L'opération spécifique consiste à augmenter le nombre d'étages de la tour cible de 1 via le code "TopPoint[ToTa]++;" Cette étape est une partie importante du processus de résolution d’énigmes et j’espère qu’elle aidera tout le monde à passer le niveau en douceur.
}
La fonctionvoid Nuo(int FromTa, int MidTa, int ToTa, int NeedMove) est la principale solution au problème de la Tour de Hanoï. Nous pouvons utiliser cette fonction pour résoudre le problème de la Tour de Hanoï compte tenu des conditions initiales et de la hauteur de la tour.
{
Jetons un coup d’œil aux méthodes spécifiques de résolution d’énigmes. Lorsque la hauteur de la tour à déplacer est supérieure ou égale à 2 étages, on peut effectuer les opérations suivantes :
{
Nuo(FromTa, ToTa, MidTa, (NeedMove-1)); //Déplacez d'abord tous les N-1 du haut sauf celui du bas vers la tour du milieu. Pendant le puzzle, nous devons utiliser trois tours (FromTa, ToTa et MidTa) pour déplacer les assiettes. Tout d’abord, nous déplaçons les plaques N-1 supérieures de FromTa vers MidTa (implémenté en appelant la fonction de manière récursive). Ensuite, déplacez la plaque inférieure de FromTa vers ToTa. Enfin, déplacez les plaques N-1 de MidTa vers ToTa (également ajustées de manière récursive
NuoYiWei(FromTa,ToTa); //Déplacez la plaque inférieure de la tour de départ vers la tour cible.
Nuo(MidTa,FromTa,ToTa,(NeedMove-1)); //Enfin, déplacez tous les éléments N-1 déplacés vers la tour du milieu vers la tour cible (en supposant que cette fonction puisse réaliser cette fonction)
}
autre
{
Afin d'aider les joueurs qui n'ont pas encore réussi le niveau, découvrons les méthodes spécifiques de résolution d'énigmes. S'il ne reste qu'un seul bloc à déplacer, déplacez-le simplement.
}
}
Cette fonction est écrite en C++. Veuillez noter que si vous utilisez le langage C, vous devez faire attention à certains détails.
J'ai un programme Tower of Hanoi écrit en langage C. Si vous en avez besoin, vous pouvez m'envoyer un e-mail à sxt9840210@163.com et m'expliquer clairement de quel type de programme vous avez besoin.
J'ai déjà enregistré la réponse de quelqu'un d'autre, jetez un oeil :
L'idée principale de l'algorithme récursif est d'utiliser l'objectif de solution comme point de départ et d'appeler progressivement son propre processus de solution pour résoudre les éléments inconnus jusqu'à ce que la limite de la récursion soit atteinte, qui est la condition initiale. Cette méthode est différente de la méthode traditionnelle partant des conditions initiales, mais elle constitue l’un des moyens efficaces de résoudre le problème. Grâce à des algorithmes récursifs, nous pouvons progressivement décomposer des problèmes complexes en sous-problèmes simples et finalement obtenir la réponse globale. La clé de la récursivité est de clarifier la limite de récursion et de garantir que le processus récursif peut être correct
La clé pour résoudre le problème de la Tour de Hanoï est d'analyser les règles de mouvement, de trouver des modèles et de déterminer les conditions aux limites.
Si vous souhaitez déplacer n plaques de A à C, vous pouvez suivre les étapes ci-dessous : (1) Déplacer n-1 plaques de A à B (2) Déplacer la nième plaque de A à C (3) Déplacer n ; -1 assiettes de B à C. En appelant la fonction de manière récursive, les autres plaques sur A peuvent continuer à se déplacer selon les trois étapes ci-dessus jusqu'à ce que la condition aux limites n=1 soit atteinte. De cette façon, la tâche peut être accomplie avec succès ! J'espère que cette méthode de puzzle pourra être utile aux joueurs qui n'ont pas encore réussi le niveau.
Lorsque votre pensée est claire, le programme devient plus facile à comprendre. Dans le programme, l'essentiel est d'analyser les paramètres à chaque appel de la fonction de mouvement ainsi que la relation entre les tours A, B et C. Illustrons avec un exemple pratique ci-dessous.
Afin d'aider les joueurs qui n'ont pas encore résolu le puzzle, examinons de plus près comment le résoudre. Tout d’abord, nous pouvons utiliser la fonction « move(int n, int x, int y, int z) » pour effectuer des opérations de déplacement.
②{
③ si (n==1)
Afin d'aider les joueurs qui n'ont pas encore réussi le niveau, découvrons les méthodes spécifiques de résolution d'énigmes. J'ai préparé pour vous les étapes suivantes : 1. Tout d’abord, recherchez une fonction nommée printf. 2. Ensuite, entrez "%c-->%cn" entre parenthèses de la fonction printf, qui imprimera deux caractères et renverra la ligne. 3. Entre crochets, transmettez x et z comme arguments à la fonction printf.
⑤ ailleurs
⑥ {
⑦ déplacer(n-1,x,z,y);
Afin d'aider les joueurs à passer le niveau, examinons les méthodes spécifiques de résolution d'énigmes. Dans le code, il y a une ligne de code qui est "printf("%c-->%cn",x,z);". La fonction de cette ligne de code est d'imprimer la relation entre le caractère x et le caractère z. En observant les résultats imprimés, nous pouvons obtenir des indices qui nous aideront à résoudre l’énigme.
⑨ {getchar();}//Cette phrase est-elle nécessaire ? J'ai l'impression qu'il peut être supprimé
⑩ déplacer(n-1,y,x,z);
}
}
Par exemple, il y a 4 assiettes, et maintenant elles sont toutes placées sur la Tour A. Le rayon des plaques est plus grand selon les nombres 1, 2, 3 et 4. Déplacez maintenant les 4 assiettes en C et disposez-les dans l'ordre d'origine. Tout d’abord, nous considérons comment déplacer le n° 4 vers C ? Nous devons utiliser B comme intermédiaire et déplacer d’abord les trois ci-dessus vers B. Le fonctionnement de cette étape est que ① dans le programme commence à appeler la fonction de déplacement (le premier appel est enregistré comme un, bien sûr, n=4 maintenant, et ensuite il est jugé que ③n!=1, donc ④ n'est pas). exécuté mais ⑤ est appelé à nouveau (marqué comme deux) Considérez comment déplacer 3 disques vers B. Il s'agit d'un appel récursif, nous revenons donc à nouveau à ① et commençons à appeler la fonction de déplacement, mais les paramètres correspondants ont changé, car cette fois nous devons envisager non pas de déplacer 4 disques de A à C, mais comment passer de A. Déplacez 3 disques vers B. Parce que n = 3, il ne peut pas être déplacé directement et nécessite l'aide de C comme intermédiaire. Considérons d'abord la méthode de déplacement de deux vers C, alors allez à ⑤ et appelez à nouveau la fonction de déplacement (marquée comme trois). De la même manière, deux disques ne peuvent pas être déplacés directement de A vers C, le processus de déplacement de 1 vers B doit donc être envisagé en utilisant B comme intermédiaire. Cette fois, il utilise B comme intermédiaire et se déplace vers C comme objectif. Ensuite, appelez à nouveau la fonction de déplacement de manière récursive (marquée par quatre), ce qui signifie passer à B, ce qui peut être fait directement. Le programme exécute les phrases ③ et ④. Le programme saute de l'appel le plus interne (c'est-à-dire saute du quatrième appel) et revient au précédent (la troisième fois), et continue vers le bas à partir du troisième appel vers la fonction de déplacement. , c'est-à-dire ⑧, c'est-à-dire 2 Le nombre s'est déplacé vers C, puis a continué jusqu'à
⑩, puis déplacez celui qui a été déplacé vers B vers C, revenant ainsi à la deuxième récursion (le moment où 3 disques ont été déplacés vers B en utilisant C comme intermédiaire). Exécutez ⑧, déplacez le troisième disque de A vers B, puis entrez ⑩ Dans cet appel, comme les deux disques sur C sont déplacés vers B avec A comme intermédiaire, un autre appel récursif est nécessaire, correspondant au transfert de paramètres. analysé clairement qui est la tour d'origine, qui est la tour cible et qui est la tour intermédiaire. Le processus est similaire à l’analyse ci-dessus et ne sera pas répété ici.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!