luogu1242新汉诺塔(深搜)

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

题目链接

#同类的题目还有这些#

题目大意:

    1 给出汉诺塔的开始状态和结束状态,求最小的转移过程。

    2 要输出过程

解题思路:

    1 首先要深刻理解汉诺塔的游戏规则:任何时候,大盘子一定在小盘子下面。

    2 搜索过程:

        (1)从大到小搜索,让当前的盘子 c 从当前的 x 棍子放到目标的 y棍子上;

        (2) 如果 (1) 不能执行,是因为比 c 小的盘子们挡住了, 把这些挡路的小盘子,都放在第三根棍子上缓存。


总结:整个思路非常简单粗暴,代码也不长,关键是要深刻理解汉诺塔的游戏规则。

上代码:

#include<cstdio>

int n,x,b[110],e[110],ans=0;
int ef[10],sf[10];

void mov(int c,int x,int y)
{
	printf("move %d from %c to %c\n",c,x+'A',y+'A');

	b[c]=y;//更新 c 所在的棍子 
	
	ans++;
}

void dfs(int c,int x,int y,int k)//把 c 盘从 x 放到 y柱子,k 柱子是缓存 
{
	if(x==y) return ;//已经放好了
	for(int i=c-1;i>=1;i--)
	{
		dfs(i,b[i],k
hdu1997 汉诺塔VII(度优先索) Problem Description n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列。由于发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上,即各柱子从下往上的大小仍保持如下关系 :  n=m+p+q a1>a2>...>am b1>b2>...>bp c1>c2>...>cq ai是A柱上的盘的盘号系列,bi是B柱上的盘的 阅读详情

相关推荐

【洛谷】P1242 汉诺塔

汉诺塔问题是理解分治算法最经典的一道题。根据分治算法的思想,第一步我们必须对原问题进行分解。在此之前,对大家进行一个提问: 把大象装进冰箱需要几步? 答案是:三步。打开冰箱门、把大象装进去、关闭冰箱门。 现在我要告诉你,求解汉诺塔问题也是三步。根据汉诺塔游戏的机制我们知道,必须先将第n个盘子移动到C杆上。但如果直接将第n个盘子移动到目标位置又是不行的,因为在这第n个盘子前还有n-1个盘子。此时,我们可以假设有一个函数function(),它可以帮我们将前面n-1个盘子移动到除目标位置以及起始位置外的那个杆子

酱懵静的博客 2077

# 汉诺塔问题与二叉树遍历算法详细报告

2. **二叉树遍历**是树结构操作的基础,前序、中序、后序三种遍历方式各有其应用场景。递归实现代码简洁直观,而非递归实现虽然代码相对复杂,但避免了递归栈溢出的风险,在处理大规模二叉树时更加稳定。 3. 递归方法的核心是将问题分解为更小的子问题,而非递归方法则通常需要借助栈等数据结构来模拟递归过程,两种方法各有优劣,需要根据具体场景选择合适的实现方式。

[Blog][Domain] programb.blog.csdn.net 389

大屏用中空圆盘转动径向树图

适合大屏显示的径向树图代码demo,中间圆环+文字,连线不穿越文字,缓慢转动。

洛谷 P1242 汉诺塔

原题链接 题目描述 设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号。将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A、B、C,这个状态称为初始状态。 现在要求找到一种步数最少的移动方案,使得从初始状态转变为目标状态。 移动时有如下要求: ·一次只能移一个盘; ·不允许把大盘移到小盘上面。 输入输出格式 输入格式: 文件第一行是状态中圆盘总数; 第二到第四行...

weixin_30512089的博客 253

洛谷 P1242 汉诺塔

传送门 题目描述 设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号。将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A、B、C,这个状态称为初始状态。 现在要求找到一种步数最少的移动方案,使得从初始状态转变为目标状态。 移动时有如下要求: 1. 一次只能移一个盘; 2. 不允许把大盘移到小盘上面。 输入输出格式 输入格式: 文件第一行是状态中圆盘总数; ...

Dawn_LLLLLLL 563

luogu1242 汉诺塔

就是一步一步把大的往目标地放。 #include <iostream> #include <cstdio> using namespace std; int fro[55], too[55], cnt, uu, n, ans=0; void dfs(int x, int qu){ if(fro[x]==qu) return ; for(int i...

dianjiaxian1205的博客 90

luogu P1242 汉诺塔

题目传送门:https://www.luogu.org/problemnew/show/P1242题意:有n个大小不相等的圆盘,三个塔,求将现在圆盘移到目标状态的最小步数及方案(要求:像汉诺塔一样,大在下,小在上,一次只能移动一个圆盘)。 思路:dfs。除此之外,我们还可以想到优先处理的号圆盘(因为对于任何一个塔,都是从下往上摆的,如果先摆好上面,再摆下面时就会乱掉)。知道这点,就可以开始了。代码...

zsyz_ZZY的博客 333

luogu试练场提高历练地

1 索Ex    题目 状态 思路 P1120 小木棍 [数据加强版] 未解决   P1378 油滴扩展 解决  (全排列思维) P1514 引水入城 解决  宽+DP,注意要:思考细节和特判 P1312 Mayan游戏 未解决   P1441 砝码称重 解决  组合数+01背包 p1242 汉诺塔 解决 简单暴力的思路,关键要理解汉诺塔的游戏规则     ...

liusu201601的博客 505

洛谷P1242 汉诺塔 【神奇的递归】

题目描述 设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号。将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A、B、C,这个状态称为初始状态。 现在要求找到一种步数最少的移动方案,使得从初始状态转变为目标状态。 移动时有如下要求: ·一次只能移一个盘; ·不允许把大盘移到小盘上面。 输入输出格式 输入格式: 文件第一行是状态中圆盘总数; 第二到第四行分别是...

weixin_30758821的博客 287

洛谷 1242

汉诺塔,经典的递归问题,我们考虑每个盘子的初态和末态,对于一个盘子的移动限制就是大的不能放在小的上,那么我们肯定是先选择移动大的,那么如何移动?假设我们将一个大的从A移动到C,那么我们一定是把A上的小的和C上的小的移动到B,否则无法移动,这样我们就找到了一种移动方法,从大到小移动,这样移动一定是最少的,因为每一步的移动都是必要的,缺失一步移动大盘子都无法移动。 #include #include

TSOI_Vergil的博客 390

刷题记录

刷题记录 P4562 ​ 入度为000的点为关键点,因此考虑最后一个关键点的位置即可,然后利用组合数学知识,可得公式:ans=∑p=knpCp−1k−1n!(n−k)!ans=\sum\limits_{p=k}^npC_{p-1}^{k-1}n!(n-k)!ans=p=k∑n​pCp−1k−1​n!(n−k)! 即从前p−1p-1p−1个位置中选择k−1k-1k−1个位置作为关键点的位置,然后分别全排列即为位置ppp的贡献。 筛入度为000的点需要用O(n)O(n)O(n)的欧拉筛。 void ss(i

Harris-H的博客 629

基础算法——基本思想

竞赛基础算法、思想

ZG6677的博客 521

洛谷试炼场-提高组题解汇总

索ExP1120 小木棍 [数据加强版]    [题解]P1378 油滴扩展    [题解]P1514 引水入城    [题解]P1312 Mayan游戏    [题解]P1441 砝码称重    [题解]P1242 汉诺塔    [题解]动态规划TG.lv(1)...

marvlho的博客 822

洛谷P1251

关于构图: 这是一道最小费用(费用指单价)最大流的题目。 首先,我们拆点,将一天拆成晚上和早上,每天晚上会受到脏餐巾(来源:当天早上用完的餐巾,在这道题中可理解为从原点获得),每天早上又有干净的餐巾(来源:购买、快洗店、慢洗店)。 1.从原点向每一天晚上连一条流量为当天所用餐巾x,费用为0的边,表示每天晚上从起点获得x条脏餐巾。 2.从每一天早上向汇点连一条流量为当天所用餐巾x,费用为0的...

HumveeA6的博客 302

汉诺塔——洛谷P1242 汉诺塔

https://www.luogu.org/problem/show?pid=1242 本来就对这个汉诺塔不是很熟悉的啦; 做了这道题目,总算理解了啦; 其实就是一个大暴力的啦; 这题实际上不难。就是先把每一个圆盘的初始所在的塔和最终所在的塔记录下来,接着从大盘到小盘枚举开始递归,而递归过程的作用就是使第x个圆盘能移到第y个塔上,并移动。 依照题意,不能使第x个圆盘移动到第y个塔上的

我怎么这么菜的呢 1111

洛谷 P1242 汉诺塔 详细正解 索、概率论、递归

洛谷 P1242 汉诺塔 详细正解 汉诺塔 90分解法 分析 众所周知,汉诺塔是一道著名的递归例题,几乎所有人学习递归的第一道例题就是汉诺塔 汉诺塔移动的方法很简单,就是先移动大的,再移动小的 每次移动n号盘子的时候,将比n小的盘子都移动到中转柱上 代码 #include <iostream> #include <cstdio> using na...

qcwlmqy的博客 780

Luogu P4285 [SHOI2008]汉诺塔

大家知道简单的汉诺塔怎么做吗? 有个公式对吧 就是2n−12^n-12n−1 操作就是将第一个柱子除底盘外的移到第二个柱子,然后把底盘移到第三个柱子,然后把第二个柱子的盘子移动到第三个 但基本的汉诺塔问题的操作是没有限制的,就是你想移哪儿移哪儿,但是这题不一样,这题强制了一个操作优先级,所以要用不同的方法去做。 f[x][i]: 第x号柱子移i个盘子到最优柱子的最优解 p[x][i]:第x号柱子移i个盘子到p[x][i]号柱子是最优解 那么就有两种情况,第一种就是普通的汉诺塔移动 也就是上面所讲的: f[a

xlqs23的博客 266

2021.01.20 强化模拟赛(3-3)

3.汉诺塔 同时也是洛谷P1242 题。但是这个代码过不去最后一个测试点。 #include<cstdio> #include<iostream> #include<cstring> using namespace std; int step; char s[4]= {' ','A','B','C'}; int xian[64], yuan[64], n; void mov(int c,int b) { int x,l; if (b == yuan[c]) retu

ranerr的博客 252
上一篇: bzoj1083: [SCOI2005]繁忙的都市(最小生成树模板)
下一篇: luogu试练场提高历练地
liusu201601
博客等级 码龄9年 387粉丝 186原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值