题意思路都来自大白书上,用到参考局面的思想非常巧妙
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 100
#define LL long long
int cas=1,T;
int start[maxn];
int finish[maxn];
LL f(int *p,int i,int fin)
{
if (!i)
return 0;
if (p[i]==fin)
return f(p,i-1,fin);
return f(p,i-1,6-p[i]-fin)+(1LL << (i-1));
}
int main()
{
int n;
while (scanf("%d",&n)!=EOF && n)
{
for (int i = 1;i<=n;i++)
scanf("%d",&start[i]);
for (int i = 1;i<=n;i++)
scanf("%d",&finish[i]);
int k = n;
while (k>=1 && start[k]==finish[k]) //找出编号最大并且需要移动的盘子
k--;
LL ans = 0;
if (k>=1)
ans = f(start,k-1,6-start[k]-finish[k])+f(finish,k-1,6-start[k]-finish[k])+1;
printf("Case %d: %lld\n",cas++,ans);
}
//freopen("in","r",stdin);
//scanf("%d",&T);
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}