C语言练习五 汉诺塔
内容纲要

思考:

一、Q:汉诺塔游戏的规则是什么?
A:共三个柱子,确定起始柱子上有N(自己定义)个盘子,大的盘子在下小的盘子在上,从起始柱子上挪到其他柱子上,且挪动过程不可以重复。
二、找共性。从A柱子挪动到C柱子,当我没有盘子时,就不需要操作,什么都不用挪动。当我有一个盘子时,直接从A—>C。有两个盘子时,需要先A->B,A->C,B->C。有三个盘子时,需要A->C,A->B,C->B,A->C,B->A,B->C,A->C,。有四个盘子的时候,A->B,A->C,B->C,A->B,C->A,C->B,A->B,A->C,B->C,B->A,C->A,B->C,A->N,A->C,B->C;
很复杂,所以共性是什么,从A到C挪一个盘子,挪一下A-C。挪两个盘子,挪到B一个,C一个,再把B的放到C上。挪三个,挪两个到B再挪最大的到C,再把两个挪到C。
四个,挪三个到B,挪一个到C,再把三个挪到C。
依次类推,要做的就是挪N-1个到B,然后挪一次A到C,再挪N-1次B到C,那么N-1次怎么挪呢,通过不断递归直到N==0,什么都不做。
三、关于hanoi函数,这里的是根据move函数来确定是往哪个柱子挪。
核心在于递归时参数的变化。递归都存在一个限制条件,这里的是N==1,就不再递归了而是去进入别的函数。

程序

#include<stdio.h>
void move(char from, char to) {
    printf("%c to %c\n", from, to);
}

void hanoi(int n, char a, char b, char c) {
    if (n == 1)
        move(a, c);  //由这里来设置我是从A柱挪到C柱
    else {
        hanoi(n - 1, a, c, b);
        move(a, c);
        hanoi(n - 1, b, a, c);
    }
}

int main(void) {
    int n;
    scanf("%d", &n);
    hanoi(n, 'A', 'B', 'C');
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇