1. Hanoi问题
一块板上有A、B和C3根针。A针上套有64个大小不等的圆盘,大的在下,小的在上。要把这64个圆盘从A针移动到C针上,每次只能移动一个圆盘,移动可以借助B针进行。但在任何时候,每个镇上的圆盘都必须保持大盘在下,小盘在上,求移动的步骤。
本算法分析如下,设A上有n个盘子。
如果n=1,则将圆盘从A直接移动到C。
如果n=2,则
(1)将A上的n-1(等于1)个圆盘移动到B上;
(2)再将A上的一个圆盘移动到C上;
(3)最后将B上的n-1(等于1)个圆盘移动到C上。
如果n=3,则
(1)将A上的n-1(等于2,令其为m)个圆盘移动到B(借助于C)上,步骤如下:
A.将A上的m-1(等于1)个圆盘移动到C上;
B.将A上的一个圆盘移动到B上;
C.将C上的m-1(等于1)个圆盘移动到B上;
(2)将A上的一个圆盘移到C上;
(3)将B上的n-1(等于2,令其为m)个圆盘移动到C(借助A)上,步骤如下:
A.将B上m-1(等于1)个圆盘移到A上;
B.将B上的一个圆盘移到C上;
C.将A上的n-1(等于1)个圆盘移到C上;
由此,完成了3个圆盘的移动过程。
从以上分析可知,当n大于2时,移动的过程可分解为3个步骤:
第一步 把A上的n-1个圆盘移到B上
第二步 把A上的一个圆盘移到C上
第三步 把B上的n-1个圆盘移动到C上,其中第一步和第三步的操作方法类似。
#include<stdio.h>
move(int n,int x,int y,int z){
if(n==1)
printf("%c-->%c ",x,z);
else{
move(n-1,x,z,y);
printf("%c-->%c ",x,z);
move(n-1,y,x,z);
}
}
main(){
int h;
printf("/ninput number:/n");
scanf("%d",&h);
printf("the step to moving %2d diskes:/n",h);
move(h,'a','b','c');
printf("/n");
}
2. 反序输出问题
反向输出一组整数
#include<stdio.h>
void reverse();
main(){
printf("运行结果为:/n");
printf("输入一组整数(以0结束):/n");
reverse();
printf("/n");
}
void reverse(){
int n;
scanf("%d",&n);
if(n!=0){
reverse();
printf("%-4d",n);
}
else
printf("/n输出一组反序数/n");
}