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