1. 程式人生 > >每週一演算法(1):漢諾塔

每週一演算法(1):漢諾塔

首先漢諾塔是使用遞迴一個非常經典的例子,

歷史故事說了也沒用,我們想象原理。

前提,三根柱子ABC,將A上的盤子數按順序挪到C,每次只能一個

1. 一個盤子,A->C

2. 兩個盤子  A->B, A->C, B->C

3. 大於兩個盤子,那我們先理解為上面一個盤子,下面n-1個盤子屬於一個整體。

先移動第一個的A->C,那麼我們在n-1(可以當成1個)需要先將A->B, 然後B->C,

即以下程式碼:

 

void hanoi(int n, char A, char B, char C) {
    if (n == 1)
    {
        printf("Move sheet %d from %c to %c\n", n, A, C);
    }
    else{
        hanoi(n - 1, A, C, B);
        printf("Move sheet %d from %c to %c\n", n, A, C);
        hanoi(n - 1, B, A, C);
    }
}

int main(int argc, char* argv[])
{
    int n;
    while (1)
    {
        printf("input:");
        scanf("%d", &n);
        hanoi(n, 'A', 'B', 'C');
    }

}