acm-雜 漢諾塔

問題是有三個插槽,n個由小到大的盤子怎麼從第一個插槽移動到第三個插槽?其中小盤子只能放在大盤子上,一次只能移動一個盤子。
以3個盤子爲例:

  1. 1號,2號移動到第二個插槽。1->2
  2. 3號移動到第三個插槽。1->3
  3. 1號,2號移動到第三個插槽。2->3
    其中第二步是直接可以完成的,也就是遞歸出口。
    第一步又可以分解爲:
  4. 1號移動到第三個插槽。1->3
  5. 2號移動到第二個插槽。1->2
  6. 1號移動到第二個插槽。3->2
    第三部可以同樣分解:
  7. 1號移動到第一個插槽。2->1
  8. 2號移動到第三個插槽。2->3
  9. 1號移動到第三個插槽。1->3
    一共需要移動3+1+3步,n個盤子需要n+1+n步。
    因爲移動n個盤子同樣可以以移動3個盤子爲基礎來理解。
    從插槽1移動n個盤子到插槽3:
  10. 前n-1個盤子移動到插槽二。
  11. 第n個盤子移動到插槽三。
  12. 前n-1個盤子在移動到插槽三。
    一步完成的直接完成,不可以直接完成的按上步分解。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    int move(int n,char x,char y,char z);
    printf("inter your number\n");
    scanf("%d",&n);
    move(n,'a','b','c');
    return 0;
}

int move(int n,char x,char y,char z){
    if(n==1){
        printf("%c-->%c\n",x,z);
    }
    else{
        move(n-1,x,z,y);
        printf("%c-->%c\n",x,z);
        move(n-1,y,x,z);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章