UVA 10795 新漢諾塔問題

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

http://7xjob4.com1.z0.glb.clouddn.com/c2dd6437bf7bef120bf27475f3097822c++

 

題意:至少多少步將當前局面狀態移動後到指定局面狀態ide

思路:先考慮最大的那個盤子,將它移到最終位置,那麼參考局面爲其中一個柱子爲空,一個爲只有最大,一個爲最小到第二大。答案爲初始局面移到參考局面+1+最終狀態移到參考局面(可逆)。將一個柱子總體移到另外一個,需2^(n-1)-1步。spa

 

 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
相關文章
相關標籤/搜索