【经典题目——递归】1.n个盘子的汉诺塔-第k步骤应该怎么挪动

【题目】

 【源代码】

 

#include<stdio.h>
int count=0;//全局变量定义在主函数前!!! 
int main()
{
	char a='a',b='b',c='c';
	int n,k;
	scanf("%d\n%d",&n,&k);
	void hnt(int n,int k,char a,char b,char c);
	hnt(n,k,a,b,c);
	return 0;
}
void 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的问题,我可以提供以下的解答。 对于汉诺塔问题,我们可以用归的方式来解决。在汉诺塔问题中,我们需要将n个盘子从A柱子移动到C柱子,其中可以借助B柱子。而每次移动时,我们需要遵循以下规则: 1. 每次只能移动一个盘子; 2. 盘子只能从上面取下来,不能从下面拿起; 3. 大盘子不能放在小盘子上面。 同时,我们可以将整个移动过程分为三个子问题:将n-1个盘子从A柱子移动到B柱子,将第n个盘子从A柱子移动到C柱子,将n-1个盘子从B柱子移动到C柱子。 因此,在归求解汉诺塔问题时,我们可以将上述三个子问题重复地进行,直到仅剩一个盘子时直接将其从A柱子移动到C柱子。 接下来,我们来回答你的问题。 首先,我需要确认一下你输入的步骤k是从1开始计数的还是从0开始计数的。假设你输入的步骤k是从1开始计数的,那么我们可以先求解出n个盘子汉诺塔问题的移动步骤,然后输出第k步骤对应的移动方法。 具体来说,我们可以使用以下的代码来求解n个盘子汉诺塔问题的移动步骤: ```python def hanoi(n, A, B, C): if n == 1: print(A, "->", C) else: hanoi(n-1, A, C, B) print(A, "->", C) hanoi(n-1, B, A, C) n = int(input("请输入盘子数量:")) hanoi(n, 'A', 'B', 'C') ``` 在上述代码中,我们定义了一个归函数hanoi,用于求解将n个盘子从A柱子移动到C柱子的移动步骤。在函数中,我们首先判断当前移动的盘子数量是否为1,如果是,则直接将这个盘子从A柱子移动到C柱子;如果不是,则先将n-1个盘子从A柱子移动到B柱子,然后将第n个盘子从A柱子移动到C柱子,最后将n-1个盘子从B柱子移动到C柱子。 接下来,我们假设你输入的是n=3,k=5,即求解3个盘子汉诺塔问题中的第5步移动。我们可以将上述代码稍作修改,输出第k步对应的移动方法: ```python def hanoi(n, A, B, C, k): if n == 1: if k == 1: print(A, "->", C) return k-1 else: k = hanoi(n-1, A, C, B, k) if k == 0: print(A, "->", C) return -1 else: return hanoi(n-1, B, A, C, k-1) n = 3 k = 5 hanoi(n, 'A', 'B', 'C', k) ``` 在上述代码中,我们在函数hanoi中增加了一个参数k,用于记录当前移动步骤的编号。在函数中,我们首先判断当前移动的盘子数量是否为1,如果是,则判断当前步骤是否是第k步,如果是,则输出移动方法,并返回k-1;如果不是,则返回k-1。如果当前移动的盘子数量不是1,则先将n-1个盘子从A柱子移动到B柱子,然后将第n个盘子从A柱子移动到C柱子。在移动完第n个盘子后,我们需要判断当前步骤是否是第k步,如果是,则输出移动方法,并返回-1;如果不是,则继续归求解n-1个盘子从B柱子移动到C柱子的移动步骤。 对于输入的n=3,k=5,上述代码的输出结果为: ``` A -> C ``` 因此,3个盘子汉诺塔问题中的第5步移动是将第1个盘子从A柱子移动到C柱子。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值