P1242 新汉诺塔

题目描述

设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号。将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A、B、C,这个状态称为初始状态。

现在要求找到一种步数最少的移动方案,使得从初始状态转变为目标状态。

移动时有如下要求:

·一次只能移一个盘;

·不允许把大盘移到小盘上面。

输入输出格式

输入格式:

文件第一行是状态中圆盘总数;

第二到第四行分别是初始状态中A、B、C柱上圆盘的个数和从上到下每个圆盘的编号;

第五到第七行分别是目标状态中A、B、C柱上圆盘的个数和从上到下每个圆盘的编号。

 

输出格式:

每行一步移动方案,格式为:move I from P to Q

最后一行输出最少的步数。

思路:

只有三个柱子,每次把一个柱子上面的圆盘都移到除该柱子和目标柱外的另一个柱子,

当然,要从最大的一个圆盘开始移动。

代码解释:

#include<iostream>
using namespace std;
int from[55],to[55],ans,n,t,m;
void dfs(int x,int y)//x代表第x大的圆盘,y代表移到第y个柱子上
{if(from[x]==y)return ;//如果圆盘已经在目标位置上了,就不需要再移动了for(int l=x-1;l>0;l--)//也要从大到小移动dfs(l,6-from[x]-y);cout<<"move"<<' '<<x<<' '<<"from"<<' '<<char(from[x]+'A'-1)<<' '<<"to"<<' '<<char(y+'A'-1)<<endl;from[x]=y;ans++; //于是更新第x大的圆盘的位置
}
int main()
{cin>>m;cin>>n;for(int i=1;i<=n;i++)cin>>t,from[t]=1;cin>>n;for(int i=1;i<=n;i++)cin>>t,from[t]=2;cin>>n;for(int i=1;i<=n;i++)cin>>t,from[t]=3;cin>>n;for(int i=1;i<=n;i++)cin>>t,to[t]=1;cin>>n;for(int i=1;i<=n;i++)cin>>t,to[t]=2;cin>>n;for(int i=1;i<=n;i++)cin>>t,to[t]=3;//夸张的读入QAQfor(int i=m;i>0;i--)//从最大的柱子开始移动,毕竟大柱子要放在底下dfs(i,to[i]);cout<<ans;    	return 0;
}

PS:

有这样一组数据:

3
1 3
0
2 2 1
2 2 1
0
1 3

按照曾经AC的程序,面对这样的数据,我们会先努力把圆盘 3 移动到 C 柱上。

所以我们的代码先移动了 1,2两个圆盘到 B柱,再把 3 这个圆盘从 A干脆利落地移动到 C ……

move 1 from C to A
move 2 from C to B 
move 1 from A to B
move 3 from A to C
move 1 from B to C
move 2 from B to A
move 1 from C to A
7

然而以上不是最优解。下面才是:

move 3 from A to B
move 1 from C to B
move 2 from C to A
move 1 from B to A
move 3 from B to C
5

可见我们的代码忽略了空柱的作用,误以为“必须一步把当前要移动的最大圆盘移动到目标柱子”(比如需要移动把圆盘 3从 A移到 C ,我们想尽办法把 A 和 C 两个柱子上小于 3的圆盘都移到 B )。

原因是,我们的代码已知 3是最大的圆盘,也就是其它圆盘都比它小。如果先移动它到没有清空的柱子上,我们担心它会压到小盘上,这样就不符合规则了。而在最优解中,他先把圆盘 3移动到 B 柱(因为 B 是空柱,所以我们白白担心了)。这样,接下来移动 1,2两个圆盘时就直接到了它们的目的地: A柱。

我现在除了特判还没想到别的:

​
if(m==3&&n==1&&to[3]==3)
{cout<<"move 3 from A to B"<<endl;cout<<"move 1 from C to B"<<endl;cout<<"move 2 from C to A"<<endl;cout<<"move 1 from B to A"<<endl;cout<<"move 3 from B to C"<<endl;cout<<5;		
}​

Over

转载于:https://www.cnblogs.com/qkmqkm/p/9342959.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python文件输入符_python文件IO与file操作

1 标准输入输出IO - (1) 打印到屏幕 print() print(self, *args, sep’ ‘, end’n’, fileNone): 把传递的表达式 转换成一个 字符串表达式 known special case of print """ print(value, ..., sep , endn, filesys.stdout, flushFalse) Prints the values to…

和县机电工程学校工业机器人_【校企合作】学校举行工业机器人教学系统捐赠仪式...

点击上方蓝字关注我们12月22日下午&#xff0c;我校与广东诚飞智能科技有限公司在公共实训中心会议室举行了“工业机器人教学系统”捐赠仪式。广东诚飞智能科技有限公司总经理杨成芳、区域经理杨少杰&#xff0c;学校副校长罗红金、教务科科长冯华以及机电专业组教师代表参加了…

此地钱多人傻速来

分享一下我老师大神的人工智能教程。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;还带黄段子&#xff01;希望你也加入到我们人工智能的队伍中来&#xff01;https://blog.csdn.net/jiangjunshow原文&#xff1a;http://www.wulujia.com/“此地钱多人傻速来”这…

TCP三次握手(待细研究)

xu言&#xff1a; 看到一张不错清晰的Tcp三次握手图&#xff0c;收藏 Initiator 发起人 Receiver 接收者 LISTENING 状态xx服务启动后首先处于侦听&#xff08;LISTENING&#xff09;状态。 ESTABLISHED 状态ESTABLISHED的意思是建立连接。表示两台机器正在通信。 CLOSE_WAIT…

ubuntu20.04下安装vmshare tools_Go语言的安装与配置-vscode

vscode是比较好用的&#xff0c;虽然goland自带插件但是收费&#xff0c;所以配置vscode虽然麻烦但是也值得。Step1.下载安装vscode和golangDownload Visual Studio Code - Mac, Linux, Windows​code.visualstudio.comThe Go Programming Language​golang.google.cnnext step…

小说中人称转换作用_长篇儿童小说《合欢》:一树红绒落马缨

浙江少年儿童出版社出版肖复兴的第二部长篇儿童小说《合欢》&#xff0c;因对儿童独立人格的自觉尊重与强调&#xff0c;以及对人物复杂内心世界的深度开掘与勘探&#xff0c;回应了“儿童的被发现”这一重要课题。《合欢》不仅是作者对“远逝的童年”的一次深情回眸&#xff0…

内置函数之sorted,filter,map

# 4&#xff0c;用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb # name[oldboy,alex,wusir] # print(list(map(lambda i:i"_sb",name))) #5&#xff0c;用map来处理下述l&#xff0c;然后用list得到一个新的列表&#xff0c;列表中每个人的名字都是sb结尾…

asp按时间自动递增编号_约束力最强的手铐——美国ASP钢性手铐

美国ASP公司生产的钢性手铐&#xff0c;是目前为止世界上约束力最大的手铐。这种手铐的最初设计&#xff0c;是借鉴了中国古代的刑具——枷。钢性的手铐链接&#xff0c;非常好的约束罪犯的双手&#xff0c;使其没有任何活动的空间。而且最大的好处就是&#xff0c;执法人员只要…

python按行读取文件取消空白行_在Python中读取文件时忽略空行的最简单方法

我将堆栈生成器表达式&#xff1a;with open(filename) as f_in: lines (line.rstrip() for line in f_in) # All lines including the blank ones lines (line for line in lines if line) # Non-blank lines 现在&#xff0c;lines都是非空行。这样你就不用在电话线上打两次…

SQL Server2012如何导出sql脚本并且还原数据库

一 备份数据库 1 选择某一个数据库&#xff0c;右键依次选择&#xff1a;任务》生成脚本&#xff1b; 2 选择要编写脚本的数据库对象&#xff0c;注意此处可以选择特定的数据库对象&#xff0c;我们可以选择我们需要备份的数据表。 3 在当前页面下面第一步选择高级选项&am…

脚本启动慢_Linux 常用运维脚本,建议收藏

同步本机时间ntpdate 210.72.145.44清除系统缓存&#xff0c;空出更多内存free && sync && echo 3 > /proc/sys/vm/drop_caches && free杀掉僵尸进程kill $(ps -A -ostat,ppid | awk /[zZ]/ && !a[$2] {print $2})显示全部arp解析tcpdump a…

eclipse maven项目 class类部署不到tomcat下_Servlet tomcat部署

网上搜到的很多利用eclipse结合tomcat开发servlet的教程都要修改server.xml感觉这种方式太粗暴了&#xff0c;server.xml最好是与应用无关的&#xff0c;这里比较推荐export war的方式进行部署先记录一下环境配置过程我的系统是ubuntu 14.04&#xff1b;下载eclipse for javaee…

JS数组遍历

### 三 数组的遍历( 1 ) for 循环 let ary [a, b, c, d, 12, 3, 4, f]; for (let i 0; i < ary.length; i) { console.log(ary[i]); }( 2 ) for of &#xff08;ES6 &#xff09; let ary [a, b, c, d, 12, 3, 4, f]; for(let item of ary){ console.log(…

python多线程并发写入_Python多线程并发的简单测试

之前也写了一些简单的Python程序&#xff0c;对于多线程的并发一直没有涉及&#xff0c;今天决定先突破一下&#xff0c;把这个部分的内容先快速的掌握&#xff0c;然后在这个基础上细化改进。我的好友冰川擅长Python技术&#xff0c;所以就拿来主义&#xff0c;参考了他的文章…

tensorflow 指定cpu 但是还会运行 gpu_PyTorch VS TensorFlow 谁最强?这是标星 15000+ Transformers 库的运行结果...

点击上方“AI有道”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达作者 | Lysandre Debut译者 | 陆离出品 | AI科技大本营(ID: rgznai100)【导语】自然语言处理预训练模型库 Transformers 实现了几种用于 NLP 任务的最先进的 Transformer 架构&#xff0c;如…

CSS 组合选择符

CSS 组合选择符 一、简介 组合选择符说明了两个选择器直接的关系. CSS组合选择符包括各种简单选择符的组合方式。 在 CSS3 中包含了四种组合方式: 后代选择器(以空格分隔)子元素选择器(以大于号分隔&#xff09;相邻兄弟选择器&#xff08;以加号分隔&#xff09;普通兄弟选择器…

python爬取知乎live_python爬虫——xml数据爬取

回想去年写毕业论文时候需要数据&#xff0c;虽然数据量不大&#xff0c;但是手工录入&#xff0c;也是颇费眼神。现在自学了Python&#xff0c;就拿曾经的需求当做案例吧&#xff01; 爬取目标&#xff1a;最近20年每个月的仔猪价格&#xff0c;生猪价格和猪肉价格 爬取软件&a…

after不显示_web前端入门到实战:css实现单行、多行文本超出显示省略号

前言&#xff1a;项目中我们经常遇到这种需求&#xff0c;需要对单行、多行文本超出显示为省略号。这篇文章主要总结了小编解决此问题的方法&#xff0c;有不足之处欢迎大家指正。单行文本省略.ellipsis-line {border: 1px solid #f70505;padding: 8px;width: 400px;overflow: …

linux下查看内存使用情况

基本内存术语解读 1> free -m 同样是做为缓存&#xff0c;buffers和cache又有啥区别呢&#xff1f; 于是又查了些资料&#xff0c;发现buffers实际应该是叫“缓冲”&#xff0c;其英文解释是&#xff1a;A buffer is something that has yet to be "written" to d…

redistemplate使用_如何使用 SpringBoot + Redis 优雅的解决接口幂等性问题

# 前言在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求&#xff0c;我们来解释一下幂等的概念&#xff1a;任意多次执行所产生的影响均与一次执行的影响相同。按照这个含义&#xff0c;最终的含义就是 对数据库的影响只能是一次性的&#xff0c;不能重复处理。如何…