uva10795 - 新汉诺塔问题 (递归)
来源:互联网 发布:开源 量化交易软件 编辑:程序博客网 时间:2024/05/17 09:20
题意:
汉诺塔问题,给n个大小不同的碟子及它们的初始位置和目标位置,求出最少的步数,使得每个碟子从初始位置移动到目的位置。
思路:
找出需要移动的最大碟子k, 将1~k 移动到 pos位置(6- start[k] - finish[k] --- ( 三个柱子位置1+2+3 - 初始位置 - 目的位置 )---- 即转移需要借用的柱子的位置),同时要让k-1移动到6-start[k]-finish[k]位置,让k-2移动到6-(6-start[k]-finish[k])-finish[k-1],再将1~k-2移动到k-1上,如此递归...
代码:
#include <cstring>#include <cstdio>#include <algorithm>const int N = 65;int start[N], finish[N], n;long long ans;long long f(int *s, int i, int pos) {if (i == 0)return 0;if (s[i] == pos) return f(s, i - 1, pos);return f(s, i - 1, 6 - s[i] - pos) + (1LL << (i - 1));}int main() {int Case=0;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]);int k = n;while (k >= 1 && start[k] == finish[k]) k--; ans = 0; if (k >= 1) {int pos = 6 - finish[k] - start[k];ans = f(start, k - 1, pos) + f(finish, k - 1, pos) + 1;}printf("Case %d: %lld\n", ++Case, ans);}return 0;}
0 0
- uva10795 - 新汉诺塔问题 (递归)
- uva10795 - A Different Task(新汉诺塔问题)
- 例题1.11 新汉诺塔问题 UVa10795
- Uva10795 新汉诺塔问题(转化模型,经典题)
- uva10795(汉莫塔)
- uva10795
- uva10795
- UVa10795
- UVa10795
- 哈诺塔题型问题+uva10795+URAL 2029
- uva10795-汉诺塔新问
- 打靶问题(递归)
- 打靶(递归)问题
- 递归问题(Recursive)
- 汉诺塔问题(递归)
- 汉诺塔问题(递归)
- 迷宫问题(递归)
- 汉诺塔问题(递归)
- 【源】从零自学Hadoop(13):Hadoop命令下
- 【源】从零自学Hadoop(14):Hive介绍及安装
- 【源】从零自学Hadoop(15):Hive表操作
- Ubuntu 64位adb无法使用问题的解决
- 【源】从零自学Hadoop(16):Hive数据导入导出,集群数据迁移上
- uva10795 - 新汉诺塔问题 (递归)
- 【源】从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下
- [置顶]【源】从零自学Hadoop系列索引
- SpringMVC接收json数据中的一些问题(415错误的解决)
- android 基础知识点(面试准备)
- Unity Flat Shading实现低多边形(low-poly)效果
- 逆波兰表达式题解
- HDU 1560 - DNA sequence
- Android: 调用LayoutInflater方法时warning和exception