汉诺塔相关,递归(新汉诺塔问题,uva 10795)
2016-10-22 17:12
274 查看
想到了要有一个中间状态,要递归求解,但最后还是没想通。在汉诺塔问题中,小块是可以无视垫在最底下的大块的。这就为递归奠定了基础。我们只要先把大块处理好,剩下的小块就可以无视大块处理了。我们先处理最大的需要移动的块那么所有比他小的块就需要先移到备用柱上,然后才可以移动最大快。处理完这个最大快后,就可无视掉他,然后递归处理下一个更小的最大块了。而中间状态就是第一个需要移动的最大块可以移动的状态。
注意一个细节
代码
注意一个细节
1ll<<(k-1)
代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll N; ll S[65]; ll E[65]; ll kase; ll f(ll P[],ll k,ll to) { if(k==0) return 0; if(P[k]==to) return f(P,k-1,to); return f(P,k-1,6-P[k]-to)+(1ll<<(k-1)); } int main() { while(scanf("%lld",&N)==1&&N) { for(ll i=1;i<=N;i++) scanf("%lld",&S[i]); for(ll i=1;i<=N;i++) scanf("%lld",&E[i]); ll k=N; while(k&&S[k]==E[k]) k--; printf("Case %lld: %lld\n",++kase,k?f(S,k-1,6-S[k]-E[k])+f(E,k-1,6-S[k]-E[k])+1:0); } return 0; }
相关文章推荐
- uva10795 - 新汉诺塔问题 (递归)
- 【汉诺塔问题】UVa 10795 - A Different Task
- uva 10795 新汉诺塔问题
- UVa 10795 A Diffenent Task 新汉诺塔问题
- UVa --- 10795 A Different Task 汉诺塔不一样的操作【递归 + 思维】
- UVA 10795 新汉诺塔问题
- UVA 10795 新汉诺塔问题
- UVa10795新汉诺塔-深入了解递归
- UVA 10795 A Different Task(新汉诺塔问题)
- UVA 10795 A Different Task(汉诺塔 递归))
- UVA - 10795(新汉诺塔问题)
- 例1.11 新汉诺塔问题 A Different Task UVA - 10795 中间状态+逆向思维
- 提高级源码:三柱汉诺塔相关扩展问题(百度帖吧)
- 汉诺塔问题 递归
- 汉诺塔问题C++的递归实现 [
- 河内之塔(汉诺塔问题--------递归
- C语言 N阶汉诺塔问题的递归实现
- 汉诺塔、反向输出问题--利用递归实现
- 通过汉诺塔问题来理解递归
- boj 1343汉诺塔 递归问题 多谢大牛的代码和讲解 我需要多联系类似题目