汉诺塔
来源:互联网 发布:java ca认证登录 编辑:程序博客网 时间:2024/05/29 17:38
问题:
1、 每次只允许移动一个盘子
2、 移动盘子时,编号大的盘子不能移动到编号小的盘子上面,也就是要保持每根木桩上的盘子从上到下都是递增的(任何编号的盘子都能直接移动到空的木桩上)
要求:将所有盘子从木桩1移动到木桩3
Input
一个数字n,表示初始状态有n个盘子在木桩1上
Output
输出完成游戏的所有操作,每个移动操作占一行
例如
Input
3
Output
move disk 1 from peg 1 to peg 3
move disk 2 from peg 1 to peg 2
move disk 1 from peg 3 to peg 2
move disk 3 from peg 1 to peg 3
move disk 1 from peg 2 to peg 1
move disk 2 from peg 2 to peg 3
move disk 1 from peg 1 to peg 3
思路:
递归的思路总是从最简单的开始:
先是一个,那么就是直接从一移动到三。
两个,就是把第一个移动到第二根,再移动第二个到第三根,再移动第一个到第三个完成。
不要着急想第三个,尽管三个也不难。可以这么想:目标是把两个移动到3,那么就得先把1中最底层那个移动到3,但是移动不过去,所以得先把除最底层外上面的全部移动到第二根上,然后把最底层移动过去,再把第二根的移动到第三根上。这个在两个时很容易实现。
拓展到n个,那个就是把上面n-1个移动到2,把第n个移动到3,在移动那n-1到3.而移动n-1则又可以分解成n-2….直到只需移动一个。这样就形成递归了。
代码:
#include <stdio.h> void move(int sum, int num1, int num2){//递归函数 int num3; num3 = 6 - num1 - num2; if (sum == 1){//如果已经是1了,那么就直接移动吧 printf ("move disk 1 from peg %d to peg %d\n", num1, num2); }else{ move (sum-1, num1, num3);//如果还不是1,那么继续递归,把n-1移动到2 printf ("move disk %d from peg %d to peg %d\n", sum, num1, num2);//这个输出就是把第n个移动到3中, move (sum-1, num3, num2);//再把n-1移动到3 }} int main (void){ int sum, time; scanf ("%d", &time);//这里的time的意思是有time个测试用例 while (time--){ scanf ("%d",&sum); move (sum, 1, 3); } return 0;}
以上均为个人观点,若有意见,欢迎交流
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- python标准库之sys
- 说到程序员们的心里去了!向改变世界的程序员致敬
- 四种线程池的使用
- Could not instantiate provider org.tigris.subversion.subclipse.core.svnnature for project
- SSH整合
- 汉诺塔
- 为什么要使用Base64及其编码原理和实现
- Spring AOP 实现原理与 CGLIB 应用
- JAVA 回调机制
- S5.1_Struts2_AccessWebElements action访问web对象的4种方式
- C++中的单例模式(懒汉模式、饿汉模式及线程安全问题)
- Android数据存储之SharedPreference
- 加密算法的总结
- 一、山雨欲来