题目链接

简介:新汉诺塔问题(给出了初始状态和目标状态)

分析:
我们考虑最大的盘子,如果这个盘子初始状态和中止状态在一个柱子上,说明我们根本不用移动ta
那么我们找到编号最大的需要移动是盘子k(初始状态所在的柱子和终止状态不一样)
假设k要从x—>y,那么在移动k之前三根柱子的状态一定是(我们可以忽略那些编号大于k且不需要移动的柱子):
x:k
y:空
z:1~k-1有序摆放
我们称这种状态为中间状态

由于盘子的移动是可逆的,根据对称性,
问题所需要的步数就是:(初始状态到达中间状态的步数)+(终止状态到达中间状态的步数)+1

汉诺塔问题有一个经典结论,不得不提一下:

把n个有序的盘子由一根柱子全部移动到另一根柱子上,所需的步数是:2^n-1

这就是一个递归的过程,
递归的柿子就可以表示为:f(start,i,final)=f(start,i-1,6-final-start[i])+f(finish,i-1,6-final-start[i])+1
start表示初始状态,finish表示终止状态,final表示需要移动到的柱子
我们把柱子依次编号1,2,3,那么除了初始状态和终止状态,剩下的那根柱子的编号就是6-final-finish[i]

f(P,now,final)表示当前的状态是P,我们需要把1~now个盘子全都移动到final上

怎么计算f(P,now,final)
如果当前的盘子now已经在目标柱子final上了,那f(P,now,final)=f(P,now-1,final)
如果不在目标柱子上,我们就要分成三步:

  • 把now-1个盘子移动到(6-final-P[now])
  • 把第now个盘子移动到final,需要一步
  • 把now-1个盘子从(6-final-P[now])移动到final,注意这里是把now-1个盘子全部按顺序移动到final
    根据汉诺塔问题的经典结论,这需要(2^(now-1)-1)

所以f(P,now,final)=f(P,now-1,6-final-P[now])+2^(now-1)

//这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long longusing namespace std;int n;
int start[103],finish[103];ll f(int *P,int now,int final)
{if (!now) return 0;if (P[now]==final)return f(P,now-1,final);return f(P,now-1,6-final-P[now])+(1LL << (now-1));
}int main()
{int cnt=0;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 i=n;while (i>=1&&finish[i]==start[i]) i--;ll ans=0;if (i>=1){   int t=6-start[i]-finish[i];ans=f(start,i-1,t)+f(finish,i-1,t)+1;}printf("Case %d: %lld\n",++cnt,ans);}return 0;
}

转载于:https://www.cnblogs.com/wutongtong3117/p/7673021.html

UVa10795 - A Different Task(递归)相关推荐

  1. Uva10795 A Different Task

    A Different Task https://vjudge.net/problem/UVA-10795 题目大意:给定一个汉诺塔初末状态,求从初状态到末状态最少需要多少步. 考虑最大的一个初末不同 ...

  2. UVa10795 - A Different Task

    思路:因为从0到n-1,disk的尺寸是逐渐变大,而题意是要求尺寸大的不能放在尺寸大的上面.首先选取移动前后不相等的最大的第k个disk,由于只有0,1,2三个柱子,根据第k个disk在移动前,移动后 ...

  3. 《算法竞赛入门经典——训练指南》第一章相关内容

    #<算法竞赛入门经典--训练指南>第一章相关内容 希望各位大牛能指导! 红色为已经做了的...黄色背景是还有不懂地方,希望在年前能刷完第一章啊.... 更新版.google上貌似又加了ex ...

  4. 训练指南第一部分解题报告

    主要是提供训练指南第一部分解题报告链接,后面会持续更新中 307 - Sticks  (DFS+剪枝) 11292 - Dragon of Loowater (贪心) 11729 - Commando ...

  5. 快排递归非递归python_Python递归神经网络终极指南

    快排递归非递归python Recurrent neural networks are deep learning models that are typically used to solve ti ...

  6. 零基础入门学习Python(21)-递归1

    递归是什么 递归,从原理上来说就是函数调用自身的行为 Python3出于善意的保护,对递归深度默认是有限制的,位100x,所以上面的代码才会停下来 可以自己设置递归的深度,代码如下 >>& ...

  7. python学习-----9.7-----GIL、死锁递归锁、信号量,event事件

    GIL介绍 GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全.每个进程内都会存在一把GIL,同 ...

  8. Hadoop–Task 相关

    在MapReduce计算框架中,一个应用程序被划分为Map和Reduce两个计算阶段.他们分别由一个或多个Map Task 和Reduce Task组成. Map Task: 处理输入数据集合中的一片 ...

  9. python 多线程讲解(如何实现多线程,递归锁,互斥锁,信号量,事件等)

    什么是线程 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位.线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同 ...

最新文章

  1. java bufferedwrite_Java BufferedWriter BufferedReader 源码分析
  2. 华为三层交换机路由配置案例_{华为HCNP-RS}三层交换机的配置实例
  3. c++ 该使用类内初始值么?
  4. 如何将DB2数据库转换成Oracle数据库,这一篇告诉你
  5. JavaScript 编码指南
  6. 看服务器硬盘序列号,获得服务器硬件信息(CPUID、硬盘号、主板序列号、IP地址等)...
  7. 离散傅里叶变换公式推导
  8. VASP+Phono3py计算声子linewidth
  9. 计算机组成x什么意思,cpu后面带x是什么意思
  10. 【离散数学】 MIT 6.042J 笔记 - Lecture 1 Introductions and Proofs
  11. redhat指定ntp服务器,redhat 6.3 ntp 服务器
  12. 镜头的MTF曲线分析和原理
  13. ArcGIS 教程:Workflow Manager 快速浏览
  14. An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.
  15. 页面遇到的APP兼容性问题合集
  16. 激荡20年:IE浏览器的辉煌与落寞
  17. [机器学习]Lasso,L1范数,及其鲁棒性
  18. 青岛 android培训哪家好,青岛android培训学习班
  19. 用python编写一个猜年龄的小程序-知道了这个,你也能写出 Python 趣味小程序
  20. 阴阳师服务器维护3月14,阴阳师手游抢先体验服3月14日维护更新公告

热门文章

  1. 调用 GetProcAddress 失败,在 ISAPI 筛选器 C:\Windows\Microsoft.NET...
  2. Ant基础介绍(转载)
  3. dos下批量卸载apk文件
  4. 揭秘阿里中台!一文看懂阿里推荐业务的两大利器
  5. 8 种最坑的 SQL 错误用法,你有没有踩过坑?
  6. 程序员,你想不想进大厂?
  7. 996和被辞退,二选一
  8. 2019 年 React 学习路线图
  9. 操作系统:虚拟内存的定义及实现方式
  10. Android --- 消息模式Toast.makeText.show()的几种用法总结