算法练习题(二)
题型:递归
例:汉诺塔问题
汉诺塔问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。且在移动过程中在三根柱子都始终保持大盘在下,小盘在上。
解题思路:假设有一种方法可以迁移63片圆盘,则将第64片放到另一柱子上,再将63片迁移至该柱子,则可完成迁移。以此类推第63片,第62片,则是递归思想的体现。
代码:
#include<stdio.h>
int main() {
void hanoi(int n,char one,char two,char three);
int m;
printf("input the number of diskes:");
scanf("%d",&m);
printf("The step to move %d diskes:
",m);
hanoi(m,'A','B','C');
}
void hanoi(int n,char one,char two,char three) {
void move(char x,char y);
if (n == 1)
move(one,three);
else {
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void move(char x,char y) {
printf("%c-->%c
",x,y);
}
例:刽子手问题
(2017/03/6续)
刽子手游戏是一款猜单词游戏,游戏规则:计算机想一个单词让你猜,你每次可以猜一个单词。如果单词里有那个字母,所有该字母都会显示出来,如果没有那个字母,则错误次数加1,错7次意味着失败了。
#include<stdio.h>
#include<string.h>
#define maxn 100
int left, chance;
char s[maxn], s2[maxn];
int win, lose;
void guess(char ch) {
int bad = 1,i;
for(i = 0; i < strlen(s); i++) {
if (s[i] == ch) { left--; s[i] = ' '; bad = 0;}
}
if (bad) --chance;
if (!chance) lose = 1;
if (!left) win = 1;
}
int main() {
int rnd;
int i;
while (scanf("%d%s%s", &rnd, s, s2) == 3 && rnd != -1) {
printf("Round %d
", rnd);
win = lose = 0;
left = strlen(s);
chance = 7;
for (i = 0; i < strlen(s2); i++) {
guess(s2[i]);
if (win || lose) break;
}
if (win) printf("You win.
");
else if (lose) printf("You lose.
");
else printf("You chickened out.
");
}
return 0;
}
方法:利用函数及灵活定义各种变量可以方便的解决此题。
附:诗
面朝大海,春暖花开
————海子
从明天起,做一个幸福的人
喂马、劈柴,周游世界
从明天起,关心粮食和蔬菜
我有一所房子,面朝大海,春暖花开
从明天起,和每一个亲人通信
告诉他们我的幸福
那幸福的闪电告诉我的
我将告诉每一个人
给每一条河 每一座山取一个温暖的名字
陌生人,我也为你祝福
愿你有一个灿烂的前程
愿你有情人终成眷属
愿你在尘世获得幸福
我只愿面朝大海,春暖花开
以上