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 ",cas++,ans); 37 } 38 return 0; 39 }