UVA 10795 新汉诺塔问题

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1736

http://7xjob4.com1.z0.glb.clouddn.com/c2dd6437bf7bef120bf27475f3097822

 

题意:至少多少步将当前局面状态移动后到指定局面状态

思路:先考虑最大的那个盘子,将它移到最终位置,那么参考局面为其中一个柱子为空,一个为只有最大,一个为最小到第二大。答案为初始局面移到参考局面+1+最终状态移到参考局面(可逆)。将一个柱子整体移到另一个,需2^(n-1)-1步。

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int n,sta[65],fin[65];
 5 int cas=1;
 6 
 7 long long f(int p[],int i,int fina)
 8 {
 9     if(i==0)    return 0;
10     if(p[i]==fina)  return f(p,i-1,fina);
11     return f(p,i-1,6-p[i]-fina)+(1ll << (i-1));
12 }
13 
14 int main()
15 {
16     int i,j;
17     while(scanf("%d",&n)!=EOF && n!=0)
18     {
19         for(i=1;i<=n;i++)
20         {
21             scanf("%d",&sta[i]);
22         }
23         for(i=1;i<=n;i++)
24         {
25             scanf("%d",&fin[i]);
26         }
27 
28         int k=n;
29         while(k>=1 && sta[k]==fin[k])   k--;
30 
31         long long ans=0;
32         if(k>0)
33         {
34             ans=f(sta,k-1,6-sta[k]-fin[k])+f(fin,k-1,6-sta[k]-fin[k])+1;
35         }
36         printf("Case %d: %lld\n",cas++,ans);
37     }
38     return 0;
39 }
View Code

 

posted @ 2016-07-05 19:46  cyd2014  阅读(413)  评论(0编辑  收藏  举报