刘汝佳书上的题目,思想和书上写的一样的,就不再赘述了,感觉这个想法很精妙,开始还想bfs,但是仔细一想暴力解法太耗时,最后必然超时。
#include <stdio.h>
int start[61];
int final[61];
//把盘子1,2,3,4....n从state状态全部移动到柱子target所用的最少的步数
long long f(int *state, int n, int target){
if(0 == n)
return 0;
else{
if(state[n] == target)
return f(state, n-1, target);
else
return f(state, n-1, 6-state[n]-target) + (1LL<<(n-1));
}
}
void func(int n){
int k;
long long ans;
static int case_n = 1;
for(k=n; k>=1; k--){
if(start[k] != final[k])
break;
}
if(0 == k){
ans = 0;
printf("Case %d: %lld\n", case_n++, ans);
return;
}
ans = f(start, k-1, 6-start[k]-final[k]) + 1 + f(final, k-1, 6-start[k]-final[k]);
printf("Case %d: %lld\n", case_n++, ans);
}
int main(void){
int n, i;
//freopen("input.dat", "r", stdin);
while(scanf("%d", &n), n){
for(i=1; i<=n; i++) scanf("%d", start+i);
for(i=1; i<=n; i++) scanf("%d", final+i);
func(n);
}
return 0;
}