专栏首页开心的学习之路算法训练 Hanoi问题

算法训练 Hanoi问题

问题描述

  如果将课本上的Hanoi塔问题稍做修改:仍然是给定N只盘子,3根柱子,但是允许每次最多移动相邻的M只盘子(当然移动盘子的数目也可以小于M),最少需要多少次?   例如N=5,M=2时,可以分别将最小的2个盘子、中间的2个盘子以及最大的一个盘子分别看作一个整体,这样可以转变为N=3,M=1的情况,共需要移动7次。

输入格式

  输入数据仅有一行,包括两个数N和M(0<=M<=N<=8)

输出格式

  仅输出一个数,表示需要移动的最少次数

样例输入

5 2

样例输出

7 思路:        解题需要两步:1、转换成传统Hanoi问题    2、输出转换后的步数。        1、此Hanoi塔与传统Hanoi塔的关系为:把n个盘中的每m个想成一个整体,就变成了传统的只能一次移动一个盘的Hanoi问题,n / m (如果有余数则+1)的结果就成了传统Hanoi塔的盘子数;        2、分析传统Hanoi塔,假设初始状态盘子都在柱子A上,B为目标柱子,C为临时柱子,移动两个盘,需要3步(小盘--->C,大盘--->B,小盘---->B),移动三个盘,需要把前两个盘移动到柱子C,再将最大盘移到目标柱子,再把前两个盘移动到目标柱子,所以需要的步数为3(移两个盘)+ 1(移动最大盘) + 3(移两个盘) = 7步,移动四个盘,需要把前三个盘移动到柱子C,再把最大盘移动到目标柱子,再把前三个盘子移动到目标柱子,所以需要的步数为7 + 1 + 7 = 15步,依此类推。

#include <cstdio>

int Conver(int n, int m)
{
	if(n % m != 0)
		return n / m + 1;	
	else
		return n / m;
} 

int Hanoi(int n)
{
	if(n == 2)
		return 3;
	else
		return 2 * Hanoi(n - 1) + 1;
}

int main()
{
	int n, m, con, ans;
	scanf("%d%d", &n, &m);
	con = Conver(n, m);
	ans = Hanoi(con);
	printf("%d\n", ans);
	return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 线性结构------共享栈

    如果一个程序需要使用多个栈,使用顺序栈就会造成栈空间大小难以估计,从而造成有的栈溢出有的栈空闲,此时可以建立一个共享栈,通俗地讲就是将两个栈的栈底设置在同一个数...

    刘开心_1266679
  • 最大公约数和最小公倍数

           辗转相除法(欧几里得算法)算是求最大公约数最简单高效的算法了,这几行代码用最简洁的方式写了这个算法,值得牢牢记住:

    刘开心_1266679
  • 基础练习 分解质因数

      每行输出一个数的分解,形如k=a1*a2*a3...(a1<=a2<=a3...,k也是从小到大的)(具体可看样例)

    刘开心_1266679
  • ucgui在嵌入式linux下的移植

    前几天在研究minigui,照着官方的步骤编译,竟然一堆错,不是缺这库,就是缺那库。好不容易快到了最后一步,竟然再链接时告诉我用的64位系统不兼容32位的min...

    特立独行的猫a
  • 莫队新科技——二次离线莫队入门

    掌握莫队核心科技,来入坑一下二次离线莫队~ 本文的例题是 洛谷 P4887 模板 莫队二次离线(第十四分块(前体))

    ACM算法日常
  • SAP UI5的calendar 日历控件

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载

    Jerry Wang
  • 【CodeForces 699D】Fix a Tree

    dfs找出联通块个数cnt,当形成环时,令指向已访问过节点的节点变成指向-1,即做一个标记。把它作为该联通图的根。

    饶文津
  • 、Maximum Product Subarray

    Find the contiguous subarray within an array (containing at least one number) wh...

    Tyan
  • 【校赛小分队之我们有个女生】训练赛6

    每个manager给数组a的第1到r[i]个数排序,t[i]==1则排升序,2则排降序。求m个manager排序完的序列。

    饶文津
  • LWC 55:714. Best Time to Buy and Sell Stock with Transaction Fee

    LWC 55:714. Best Time to Buy and Sell Stock with Transaction Fee 传送门:714. Best T...

    用户1147447

扫码关注云+社区

领取腾讯云代金券