UVA 10795 A Different Task

来源:互联网 发布:js div滚动条回到顶部 编辑:程序博客网 时间:2024/05/01 04:31

刘汝佳书上的题目,思想和书上写的一样的,就不再赘述了,感觉这个想法很精妙,开始还想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);elsereturn 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;}



0 0
原创粉丝点击