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 - 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");}