UVA - 10795——A Different Task

题目链接: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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41380961/article/details/87924442