1. 程式人生 > >例7.8 Hanoi(漢諾)塔問題。

例7.8 Hanoi(漢諾)塔問題。

Hanoi(漢諾)塔問題。古代有一個樊塔,塔內有3個座A,B,C,開始時A座上有64個盤子,盤子大小不等,大的在下,小的在上。有一個老和尚想把這64個盤子從A座移到C座,但規定每次只允許移動一個盤子,且在移動的過程中在3個座上都始終保持天盤在下,小盤在上。在移動過程中利用B座。要求程式設計序輸出移動一盤的步驟。

Ø將n個盤子從A座移到C座可以分解為以下3個步驟:

(1)將A上n-1個盤藉助C座先移到B座上

(2)把A座上剩下的一個盤移到C座上

(3)將n-1個盤從B座藉助於A座移到C座上

Ø解題思路:

(1)命令第2個和尚將63個盤子從A座移到B

(2)自己將1個盤子(最底下的、最大的盤子)從

A座移到C

(3)再命令第2個和尚將63個盤子從B座移到C

1個和尚的做法:將63個從A到B,將1個從A到C,將63個從B到C

2個和尚的做法:將62個從A到C,將1個從A到B,將62個從C到B



#include <stdio.h>
int main()
{
  void hanoi(int n,char one,char two,char three);         // 對hanoi函式的宣告 
  int m;
  printf("input the number of diskes:");
  scanf("%d",&m);
  printf("The step to move %d diskes:\n",m);
  hanoi(m,'A','B','C');
}

void hanoi(int n,char one,char two,char three)          // 定義hanoi函式  
    // 將n個盤從one座藉助two座,移到three座 
 {
  void move(char x,char y);       // 對move函式的宣告 
  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)           //  定義move函式 
 {
   printf("%c-->%c\n",x,y);
 }