遞歸:新漢諾塔

遞歸:新漢諾塔

時間限制: 1 Sec  內存限制: 128 MB

題目描述

    設有n個大小不等的中空圓盤,按從小到大的順序從1到n編號。將這n個圓盤任意的 ide

    迭套在三根立柱上,立柱的編號分別爲A、B、C,這個狀態稱爲初始狀態。 spa

    如今要求找到一種步數最少的移動方案,使得從初始狀態轉變爲目標狀態。 code

    移動時有以下要求: blog

    ◆一次只能移一個盤; 
    ◆不容許把大盤移到小盤上面。 遞歸

 

輸入

    文件第一行是狀態中圓盤總數; 內存

    第二到第四行分別是初始狀態中A、B、C柱上圓盤的個數和從下到上每一個圓盤的編號; string

    第五到第七行分別是目標狀態中A、B、C柱上圓盤的個數和從下到上每一個圓盤的編號。 it

 

輸出

    每行一步移動方案,格式爲:move I from P to Q 
    最後一行輸出最少的步數。 io

 

樣例輸入

5
3 3 2 1
2 5 4
0
1 2
3 5 4 3
1 1

 

樣例輸出

move 1 from A to B
move 2 from A to C
move 1 from B to C
move 3 from A to B
move 1 from C to B
move 2 from C to A
move 1 from B to C
7

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 const char ch[4]={'0','A','B','C'};
 6 struct LS{
 7     int begin,end;
 8 }a[51];
 9 int ans=0;
10 void dfs(int x,int y)
11 {
12     if (a[x].begin==y)
13         return;
14     for (int i=x-1;i>=1;i--)
15         dfs(i,6-(a[x].begin+y));
16     printf("move %d from %c to %c\n",x,ch[a[x].begin],ch[y]);
17     a[x].begin=y;
18     ans++;
19 }
20 int main()
21 {
22     int n,m,x;
23     scanf("%d",&n);
24     for (int i=1;i<=3;i++)
25     {
26         scanf("%d",&m);
27         for (int j=1;j<=m;j++)
28         {
29             scanf("%d",&x);
30             a[x].begin=i;
31         }
32     }
33     for (int i=1;i<=3;i++)
34     {
35         scanf("%d",&m);
36         for (int j=1;j<=m;j++)
37         {
38             scanf("%d",&x);
39             a[x].end=i;
40         }
41     }
42     for (int i=n;i>=1;i--)
43         dfs(i,a[i].end);
44     printf("%d\n",ans);
45     return 0;
46 }
hanoi
相關文章
相關標籤/搜索