JavaOJ & 汉诺塔问题

汉诺塔定义:

  • 通俗地来讲就是:

  • 一堆盘子从一根柱子全部挪向另一根柱子
  • 并且有如下规则:
    • 一次只能移动一个盘子
    • 大盘子不能叠在小盘子之上
  • 老规矩,我们先学会思想

1. ”整体性假设“思想

  • 在这里不给动图以及不给手解方法的原因是:真的很难理解的了,即使会怎么摆了,但是也可能不会是正确解法。

  • 现在是《幻想时刻》

  • 假设,我说假设!

      • 如果如果如果有一个方法hanoi(x)(x代表总盘子数),它可以帮我们将A柱子的所有挪向C柱子*
    • 那么那么那么是不是hanoi(x - 1)就可以将A柱子的x - 1个盘子挪向B柱子!是不是?

    • 然后A柱子剩余的一个盘子是不是就可以直接放在C柱子上?

    • 那么接下来请问,hanoi(x - 1)是不是也有能力让B柱子的x - 1个盘子子全部挪到C盘子上?

  • *没错,我们幻想了一下,发现只要知道x - 1个盘子怎么移动,那么我就可以利用刚才的方法,去挪动x个盘子。

  • 那么那么那么是不是我们会挪一个盘子

    • 就会挪两个盘子,= =》就会挪三个盘子,= = = = = = = = = = = =》
      • 那就会挪x个盘子!

2. 代码设计

  • 参数:

    • 三根柱子:ABC
    • n个盘子。
public class Hanata {public static int count = 1;   //在自己类之中,静态的全局性变量public static void hanoi(int n, char pos1, char pos2, char pos3){//1. ************************************if(n == 1) {move(pos1, pos3);return; //return !!!}//2. ************************************hanoi(n - 1, pos1, pos3, pos2);move(pos1, pos3);hanoi(n - 1, pos2, pos1, pos3);}//3. ************************************public static void move(char pos1, char pos2) {System.out.println("第" + count++ + "次移动: " + pos1 + " -> " + pos2 + " ");}//4. ************************************public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();hanoi(n,'A','B','C');}
}

2.1 区域3:

public static void move(char pos1, char pos2) {System.out.println("第" + count++ + "次移动: " + pos1 + " -> " + pos2 + " ");
}
  • 移动盘子并且打印出来

2.2 区域1:

    if(n == 1) {move(pos1, pos3);return; //return !!!}
  • hanoi(1) ==> 第一个盘子的放法,我们默认A(pos1)柱子为起始柱

    • 通过测试,我们改变pos1,pos3,为其他,只是决定了所有盘子初始位置,以及第一个盘子挪向哪。
  • 那么第一个盘子放在C(pos3)柱子就好了
  • 这也是递归出口!

2.3 区域2:

    hanoi(n - 1, pos1, pos3, pos2);move(pos1, pos3);hanoi(n - 1, pos2, pos1, pos3);
  • Ⅰ. 跟刚才的想法一致,我们将A(pos1)的 n - 1 个盘子通过C(pos3)挪到B(pos2)

    • 通过上面动图思想的分析,不难发现,总有一个中间柱子充当媒介,帮助n-1个盘子的挪动
  • Ⅱ. 将A(pos1)放置到C(pos3)

  • Ⅲ.将B(pos2)的n-1个盘子以相同的方式通过A(pos1)挪到C(pos3)

2.4 测试

public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();hanoi(n,'A','B','C');
}

  • 这里为什么是31次呢,其实就是 2n -1

    • 一个盘子要1次

      • 那么两个要1 + 1 + 1 = 3
      • 那么三个要 3 + 1 + 3 = 7
      • 那么四个要 7 + 1 + 7 = 15
      • 即an = 2an-1 + 1; ==>等比数列 ==》 通式:an = 2 n - 1;*

3. 用C实现后再VS2022测试(有时停函数与清屏,更加好观察)

  • C语言实现汉诺塔自走版

  • 代码有点长,不做为重点,只是为了测试

汉诺塔自走版视频

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<Windows.h>
#include<stdlib.h>
#define NUM 5
int count = 0;
typedef struct hanuota
{char X;char Y[NUM+1];int count;
}sh;void print(sh* pa, sh* pb, sh* pc)
{sh s[3] = { *pa,*pb,*pc };int i = 0;int j = 0;sh tmp;for (i = 0; i < 3; i++){for (j = 1; j < 3 - i; j++){if (s[j].X < s[j - 1].X){tmp = s[j - 1];s[j - 1] = s[j];s[j] = tmp;}}}for (i = 0; i < 3; i++){printf("柱%c:%s\n", s[i].X, s[i].Y);}Sleep(500);}
void step(int n, sh* pa, sh* pb, sh* pc)
{if (n == 1){system("cls");printf("第%2d步:%c-->%c\n\n", ++count, pa->X, pc->X);pc->Y[(pc->count)] = pa->Y[(pa->count)-1];pa->Y[(pa->count)-1] = ' ';(pc->count)++;(pa->count)--;print(pa, pb, pc);}else{step(n - 1, pa, pc, pb);{system("cls");printf("第%2d步:%c-->%c\n\n", ++count, pa->X, pc->X);pc->Y[(pc->count)] = pa->Y[(pa->count)-1];pa->Y[(pa->count)-1] = ' ';(pc->count)++;(pa->count)--;print(pa, pb, pc);}step(n - 1, pb, pa, pc);}
}
init(sh* pa)
{int i = 0;int j = 0;for (i = NUM-1; i >=0; i--,j++){pa->Y[j] = 'A' + i;}
}
int main()
{int n = 0;sh a = { 'A',{0},NUM }, b = { 'B',{0},0 }, c = { 'C',{0},0 };sh* pa = &a, * pb = &b, * pc = &c;init(pa);print(pa, pb, pc);Sleep(2500);step(NUM, pa,pb,pc);system("cls");print(pa, pb, pc);return 0;
}

文章到此结束!谢谢观看 —>内容参考【比特科技】
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭

JavaOJ 汉诺塔问题相关推荐

  1. 汉诺塔(三)_栈的应用

    问题 E: 汉诺塔(三) 时间限制: 3 Sec  内存限制: 128 MB 提交: 2  解决: 2 [提交][状态][讨论版] 题目描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北 ...

  2. 汉诺塔怎么加计数次数c语言,C语言计算汉诺塔最小移动步数 (二)

    前几天写的:C语言计算汉诺塔最小移动步数(一) 当时还不知道用2^n-1这个公式来求解汉诺塔移动步骤.=_= 偶然间在网上发现了这个公式,发现当时写的算法还是比较繁琐的.所以又根据这个公式又写了一个. ...

  3. Ka的递归编程练习 Part4|Hanoi汉诺塔,双色汉诺塔的也有

    1 #include <stdio.h> 2 void hanoi(int s,char a,char b,char c) //a是出发盘,b是中途盘,c是结束盘 3 { 4 if(s== ...

  4. 技术图文:如何实现汉诺塔问题?

    背景 最近在辅导小孩们学习编程,在介绍函数递归时,最典型的就是汉诺塔问题了. 我在这里总结一下,以方便大家的学习. 汉诺塔问题源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在 ...

  5. 汉诺塔问题---小昝

    C语言 #include <stdio.h> void move(char A,char C){printf("%c ---> %c\n",A,C); }void ...

  6. 轻松理解汉诺塔问题(图解java描述)

    引言:(易于理解) 汉诺塔看似简单的几行代码,却蕴含着奇妙的算法.我从我个人学习的角度来说.我一开始理解了原理,但是编码不会编,这也就是所谓的眼高手低.多研究多在IDE(eclipse-java,VS ...

  7. 栈与队列5——汉诺塔问题(方案二)

    题目 汉诺塔问题的基础上,增加限制,必须得经过中间,不能直接从左到右或从右到左,求当塔有N层的时候打印最优移动过程和最优移动总步数 要求 法一:递归法 法二:非递归法,用栈来模拟 解析 法二:非递归法 ...

  8. 栈与队列5——汉诺塔问题

    题目 汉诺塔问题的基础上,增加限制,必须得经过中间,不能直接从左到右或从右到左,求当塔有N层的时候打印最优移动过程和最优移动总步数. 要求 法一:递归法 法二:非递归法,用栈来模拟 解析 法一:主要分 ...

  9. 【项目展示】自己用C语言编写的汉诺塔小游戏

    本文目录 1.前言 2.什么是汉诺塔? 3.项目规格 4.基本思路 5.源代码 6.运行结果 7.感想与心得 8.未来规划 1.前言 昨儿个把自己大一时候写过的五子棋重构了一下,之后就在想着要不把不知 ...

最新文章

  1. Linux下查看Nginx,tomcat等的并发连接数和连接状态
  2. 数理统计-5.4 三大抽样分布
  3. CSS3动画@keyframes中translate和scale混用出错问题
  4. 正则表达式-用户名规则之只含汉字、数字、字母、下划线
  5. 安全扫描工具_固件级安全,微软安全工具新增UEFI扫描功能
  6. ctfshow-WEB-web14( 利用数据库读写功能读取网站敏感文件)
  7. yolov4网络结构_上达最高精度,下到最快速度,Scaled-YOLOv4:模型缩放显神威
  8. OpenGL ES 送显 YUV NV12
  9. html打开网页过场动画_动画演示制作软件(高级版)比PPT强太多了
  10. Conditional Generative Adversarial Nets(CGAN)
  11. python利用opencv去除图片logo_用python+OpenCV去除图片水印
  12. 关于ie中使用a标签无法打开(预览)pdf问题
  13. 计算机word模块试题,计算机word考试试题1(附答案)
  14. 会声会影2023专业旗舰版新功能介绍
  15. java可变参数 map_Java第6期Collection、Map、迭代器、泛型、可变参数、集合工具类、集合结构、Debug...
  16. 面对新时代挑战,2019维谛技术峰会全面呈献硬核策略
  17. 2021CSP复赛游记,总结与回顾
  18. BABvsBABAB
  19. 开源工具利器之基于主机的IDS:Wazuh
  20. android 5寸屏分辨率是多少钱,索尼Z5尊享版的屏幕尺寸是多少?分辨率是多少?...

热门文章

  1. 程序员依然是这个时代,贫寒学子翻身的不二选择
  2. 爬虫6_周杰伦新歌《Mojito》B站弹幕分析
  3. Request和Response的概述及其方法
  4. 如何化解频临离婚边缘的婚姻危机
  5. 中国制造业的突围 --首次物联网产业系列微访谈圆满结束
  6. 【SaltStack官方版】—— EventsReactor系统—BEACONS
  7. RAID的介绍与配置
  8. android 通知栏背景颜色跟随app导航栏背景颜色变化而变化
  9. Testin徐琨:颠覆测试行业的四个必杀技
  10. 新赛季上分神器 vivo X70 Pro+首批适配《王者荣耀》120Hz极高帧率