uva 10795 A Different Task

汉诺塔问题:

首先得记住一个经典的结论:把i个盘子移动到另外一个柱子上要花2^i-1步

然后这个题:

首先从底往上找到要移动的编号最大的盘子,把上面所有的移动在临时的柱子,然后把那个编号最大的移动到目标状态,

最后把前面移到临时柱子上的移到目标状态(循环递归);

 

利用前面的那个结论递归就可以了!

代码:

 1 #include<cstdio>
 2 #define maxn 66
 3 #define ll long long
 4 using namespace std;
 5 
 6 ll f(int *p,int i,int final)
 7 {
 8     if(i==0)return 0;
 9     if(p[i]==final)return f(p,i-1,final);
10     return f(p,i-1,6-p[i]-final)+(1ll<<i-1);
11 }
12 
13 int n,s[maxn],l[maxn];
14 
15 int main()
16 {
17     int ca=1;
18     while(scanf("%d",&n)&&n)
19     {
20         for(int i=1;i<=n;i++)scanf("%d",&s[i]);
21         for(int i=1;i<=n;i++)scanf("%d",&l[i]);
22         int k=n;
23         while(k>=1&&s[k]==l[k])k--;
24         ll ans=0;
25         if(k>=1)
26         {
27             int ot=6-s[k]-l[k];
28             ans=f(s,k-1,ot)+f(l,k-1,ot)+1;
29         }
30         printf("Case %d: %lld\n",ca++,ans);
31     }
32     return 0;
33 }
View Code

 

posted @ 2013-10-28 21:06  Yours1103  阅读(166)  评论(0编辑  收藏  举报