Problem: A Different Task
Description: 给出汉诺塔的一种形态,问你至少要通过多少次的移动才能到达给定的另一种形态。
Solution: 这个题目和HDU4260很相似,只不过需要到达的那种形态是种标准形态(也就是所有的盘子都在同一根柱子上)。其实我们要发散自己的思维,既然很相像。那么我们为什么不假设这两种状态都是又标准形态变过去的呢。这种假设是完全合理的,由于可逆性和对称性。那么我们可以这样看,我们先把
src
和
des
中最大的而且不同柱子的盘子的前
n
个盘子移动都移动到
Code(C++):
#include <stdio.h>
#include <string.h>
const int M=64;
typedef long long LL;
int n;
int src[M],des[M];
LL dfs(int a[],int x,int num)
{
if(!x)
return 0;
if(a[x]==num)
return dfs(a,x-1,num);
return dfs(a,x-1,6-num-a[x])+(1LL<<(x-1));
}
int main()
{
int K=1;
while(scanf("%d",&n),n){
for(int i=1;i<=n;i++)
scanf("%d",&des[i]);
for(int i=1;i<=n;i++)
scanf("%d",&src[i]);
int top=n;
for(;top>=1&&des[top]==src[top];--top);
printf("Case %d: ",K++);
if(!top)
puts("0");
else
printf("%lld\n",
dfs(src,top-1,6-src[top]-des[top])+
dfs(des,top-1,6-src[top]-des[top])+
1LL);
}
return 0;
}