
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步。
#include <bits/stdc++.h>
using namespace std; int n,sta[],fin[];
int cas=; long long f(int p[],int i,int fina)
{
if(i==) return ;
if(p[i]==fina) return f(p,i-,fina);
return f(p,i-,-p[i]-fina)+(1ll << (i-));
} int main()
{
int i,j;
while(scanf("%d",&n)!=EOF && n!=)
{
for(i=;i<=n;i++)
{
scanf("%d",&sta[i]);
}
for(i=;i<=n;i++)
{
scanf("%d",&fin[i]);
} int k=n;
while(k>= && sta[k]==fin[k]) k--; long long ans=;
if(k>)
{
ans=f(sta,k-,-sta[k]-fin[k])+f(fin,k-,-sta[k]-fin[k])+;
}
printf("Case %d: %lld\n",cas++,ans);
}
return ;
}