题目链接:https://cn.vjudge.net/problem/UVA-10795
白书26页,例题11。
因为初始局面和目标局面之间是可逆的,所以找到一个中间局面,两个局面到中间局面的步数相加再加一为结果。
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int start[100],finish[100];
long long f(int *p,int k,int al)
{
if(k==0) return 0;
else if(p[k]==al) return f(p,k-1,al);
else return f(p,k-1,6-p[k]-al)+(1LL<<(k-1));
}
int main()
{
int n,k,carry=1;
while(~scanf("%d",&n),n)
{
for(int i=1; i<=n; i++) scanf("%d",&start[i]);
for(int i=1; i<=n; i++) scanf("%d",&finish[i]);
k=n;
while(start[k]==finish[k]) k--;
long long ans=0;
if(k>0)
{
int other=6-start[k]-finish[k];
ans=f(start,k-1,other)+f(finish,k-1,other)+1LL;
}
printf("Case %d: %lld\n",carry++,ans);
}
}