2016年4月30日 星期六

河內塔

河內塔 (n ,A,B,C) = (n-1,A,C,B)  +  n:AC  +  (n-1,B,A,C)
(說明一)
要將n個環由A塔搬至C塔,B塔可以暫放,需 2n-1步,假設n=415
1~7步:將(123)A搬至B  (說明二再拆解)
8步:將(4)A搬至C
9~15步:將(123)B搬至C  (這裏有9~15步當練習吧)
(說明二)
以上第1~7步:將(123)A搬至BC當暫放區,即n=3分成三部份
1~3步:將(12)A搬至C   (說明三再拆解)
4步:將(3)A搬至B
5~7步:將(12)C搬至B   (說明四再拆解)
(說明三)
以上第1~3步:將(12)A搬至CB當暫放區,即n=2分成三部份
1步:將(1)A搬至
2步:將(2)A搬至C
3步:將(1)B搬至C
(說明四)
以上第5~7步:將(12)C搬至BA當暫放區,即n=2分成三部份
5步:將(1)C搬至
6步:將(2)C搬至B
7步:將(1)A搬至B
C++解出
4
1:1A->B
2:2A->C
3:1B->C
4:3A->B
5:1C->A
6:2C->B
7:1A->B
8:4A->C
9:1B->C
10:2B->A
11:1C->A
12:3B->C
13:1A->B
14:2A->C
15:1B->C
 
程式碼如下
#include <iostream>
using namespace std;
int stp=0; //總步數
void hanoi(int n, char A, char B, char C)
{
        if(n==1) cout <<++stp<<":"<<n<<A<<"->"<<C<<endl;
        else
        {
                hanoi(n-1,A,C,B);
                cout <<++stp<<":"<<n<<A<<"->"<<C<<endl;
                hanoi(n-1,B,A,C);
        }
    return;
}
int main( void )
{
        int n;
        cin >> n;
        hanoi(n, 'A' , 'B', 'C');

}

0 意見:

張貼留言