今天是元旦放假第一天,想着多睡会,不想改论文了。赖床的时候刷了刷抖音,发现有很多视频反复出现这么一个题目。声称是一道农民工出的题目,难倒了几万清华北大的高材生。

说实话,这些年来这种UC式的标题让人很疲劳,标题反正是一个比一个夸张。我仔细看了看题目,分析了一下。题目如下所示。

首先声明一下我的结论,那就是这个“农民大伯”出的题目不光清华北大的高材生一笔画不出来,欧拉莱布尼茨掀开棺材板出来也是无能为力。

这个题目实际上就是图论里寻找到一条起点到终点的哈密尔顿路径的问题。哈密尔顿路径是在1859年,由爱尔兰数学家哈密尔顿提出的周游世界游戏中的一个数学概念。其定义就是在一个图中,遍历每个顶点一次且仅一次的路径称为哈密尔顿路径。

我查阅了一下哈密尔顿路径判定的必要条件,发现似乎都不能应用到这个题目上来。要从数学证明上来解决对我这种图论已经忘的差不离的菜鸡来说还是有点难度。所以我就借助网上的遍历穷举哈密尔顿路径的方法对于这个问题进行分析,解决。

首先我先将每个格子看成一个顶点,由于图里不能有斜线所以我们的问题就是在下面这个图中求取一条从顶点1到顶点13的哈密尔顿路径(通过其他所有顶点并且只能通过一次)。

把这个图用邻接矩阵表示出来(18个点就是18*18的矩阵,还是有点大噻)

然后用https://blog.csdn.net/zhangyifei521/article/details/53283028里的Java源码,把里头的邻接矩阵X换成上面那个,源码如下所示。

package tiktok;public class hamilton {public static void main(String[] args) {hamilton obj = new hamilton();int[][] x = {{0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},{1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},{0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0},{0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0},{0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0},{0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0},{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1},{0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0}   };//        int[][] y = { { 0, 1, 0, 0, 0, 1 },
//                      { 1, 0, 1, 0, 0, 1 },
//                      { 0, 1, 0, 1, 1, 0 },
//                      { 0, 0, 1, 0, 0, 0 },
//                      { 0, 0, 1, 0, 0, 1 },
//                      { 1, 1, 0, 0, 1, 0 } };
//
//        int[][] z = { { 0, 1, 1, 0, 0, 1 }, { 1, 0, 1, 0, 0, 0 },
//                { 1, 1, 0, 1, 0, 1 }, { 0, 0, 1, 0, 1, 0 },
//                { 0, 0, 0, 1, 0, 1 }, { 1, 0, 1, 0, 1, 0 } };
obj.allHamiltonPath(x); // list all Hamiltonian paths of graph// obj.HamiltonPath(z,1); //list all Hamiltonian paths start at point 1
}static int len;static int[] path;static int count = 0;public void allHamiltonPath(int[][] x) { // List all possible Hamilton path// in the graphlen = x.length;path = new int[len];int i;for (i = 0; i < len; i++) { // Go through column(of matrix)path[0] = i + 1;findHamiltonpath(x, 0, i, 0);}}//  public void HamiltonPath(int[][] x, int start) { // List all possible
//                                                      // Hamilton path with
//                                                      // fixed starting point
//      len = x.length;
//      path = new int[len];
//      int i;
//      for (i = start - 1; i < start; i++) { // Go through row(with given
//                                              // column)
//          path[0] = i + 1;
//          findHamiltonpath(x, 0, i, 0);
//      }
//  }private void findHamiltonpath(int[][] M, int x, int y, int l) {int i;for (i = x; i < len; i++) { // Go through rowif (M[i][y] != 0) { // 2 point connectif (detect(path, i + 1))// if detect a point that already in the// path => duplicatecontinue;l++; // Increase path length due to 1 new point is connectedpath[l] = i + 1; // correspond to the array that start at 0,// graph that start at point 1if (l == len - 1) {// Except initial point already count// =>success connect all pointcount++;if (count == 1)System.out.println("Hamilton path of graph: ");display(path);l--;continue;}M[i][y] = M[y][i] = 0; // remove the path that has been get andfindHamiltonpath(M, 0, i, l); // recursively start to find new// path at new end pointl--; // reduce path length due to the failure to find new pathM[i][y] = M[y][i] = 1; // and tranform back to the inital form// of adjacent matrix(graph)
            }}path[l + 1] = 0; // disconnect two point correspond the failure to find// the..} // possible hamilton path at new point(ignore newest point try another// one)public void display(int[] x) {System.out.print(count + " : ");for (int i : x) {System.out.print(i + " ");}System.out.println();}private boolean detect(int[] x, int target) { // Detect duplicate point in// Halmilton pathboolean t = false;for (int i : x) {if (i == target) {t = true;break;}}return t;}
}

运行结果会把所有的哈密尔顿路径(不限制起点终点)都打印出来,一共有672条哈密尔顿路径。

但是如果将起点限制为顶点1,终点限制为顶点13,那么没有一条哈密尔顿路径可以满足此条件。(起点为1的哈密尔顿路径有78条,但是没有一条终点为13)

所以,通过穷举遍历的方法,这道农民大伯出的题目是无解的。当然各位抖音上的大神通过折纸,画到外面的方式来增加/减少图中的顶点,也许确实可以找到这样一条路径,但是可能也违背了农民大伯的初衷了吧。

另外,如果有大佬知道怎么数学证明这个问题的话,也欢迎在评论里留言,大家一起交流学习。

转载于:https://www.cnblogs.com/wojiaozhangtao/p/10200365.html

抖音上农民伯伯出的题,真的会难倒清华北大的高材生吗?相关推荐

  1. 抖音上樱花飘落骗赞,真的代码我一定要替原作者发布一下,只为支持原创,打击不要脸骗赞!

    抖音上10几行代码就给你来个3d效果的樱花飘落(WDNMD骗谁呢)原作者代码我拼起来总共1100多行! 代码来自博客:https://blog.csdn.net/weixin_43664418/art ...

  2. 抖音上免费涨粉的方法,制作出一个爆款视频!

    要说抖音上免费涨粉的方法,莫过于制作出一个爆款视频了. 2018年, 抖音怎么免费涨粉最值得拿来一说的案例就是"成都小甜甜",一夜暴涨500万粉丝,而且都是免费的.这是微博.微信等 ...

  3. python抖音上的视频_《我看抖音都出3分钟的视频了,怎么做到的》 python抖音视频上传...

    Python是什么?在抖音上看到好多培训广告 官方的讲,Python是一种计算机程序设计.是一种面向对象态类型语言,最初被设计编写自动化脚本,随着版本的不断更新和语言新功能的添加,越来越多被用于独立的 ...

  4. python编程工资-看到抖音上Python工程师晒得工资条,我沉默了......

    原标题:看到抖音上Python工程师晒得工资条,我沉默了...... 我是个抖音中毒者 闲来无事就喜欢刷抖音 最近刷到了一个Python工程师的工资条 然后我默默的打开看了 然后就默默的关闭了 如今P ...

  5. python学会后工资-看到抖音上Python工程师晒得工资条,我沉默了......

    原标题:看到抖音上Python工程师晒得工资条,我沉默了...... 我是个抖音中毒者 闲来无事就喜欢刷抖音 最近刷到了一个Python工程师的工资条 然后我默默的打开看了 然后就默默的关闭了 如今P ...

  6. 抖音上热门有时间吗 先改md5再剪辑视频

              抖音上热门有时间吗 先改md5再剪辑视频          年初,抖音和微信的争执再一次掀起这个"争论".1月初微信疑似因抖音App涉及违规使用用户隐私问题暂停 ...

  7. 动态给a标签赋值_怎样利用Excel制作抖音上的心形动态函数图像?

    最近在抖音上看到有用Excel制作心形动态函数图像,感觉很新奇,闲来无事,准备自己动手做做,遂网上搜了教程,按照教程一步步做,前面都很顺利,但到最后一部确卡壳,问了公司Excel大牛也未找到原因,知道 ...

  8. 抖音python广告_抖音上好看的小姐姐,Python给你都下载了

    image 阅读文本大概需要 15 分钟. 目 标 场 景 相信大家平时刷抖音短视频的时候,看到颜值高的小姐姐,都有随手点赞关注的习惯. 如果一条条去刷确实很耗时间,如果 Python 能帮忙筛选出颜 ...

  9. 抖音计算机音乐你要我,抖音上很火的我要你快乐我要你快乐是什么歌?

    最近在抖音上听到一首歌很洗脑,让人反复哼唱,其中有句歌词是我要你快乐我要你快乐,这是什么歌呢?下面让无损音乐吧小编来告诉你吧,我要你快乐我要你快乐是来自G.E.M. 邓紫棋演唱的<你不是真正的快 ...

最新文章

  1. OpenSSL中对称加密算法DES常用函数使用举例
  2. 05Observer/Event(观察者)模式
  3. python中列表的sort方法_python中列表的sort方法使用详解
  4. 关于yield的一些资料
  5. 李宏毅机器学习(六)自监督学习(一)
  6. 单元测试——Winfrom
  7. Centos7安装完毕后无法联网的解决方法
  8. 11.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 自定义插件
  9. php合并两个有序链表,合并两个排序的链表
  10. 如何将图片转化为base64编码格式显示
  11. Maven下载安装及修改setting内容
  12. day7-字典和集合作业
  13. 面向对象:兜兜转转了很久,希望你恰好也在
  14. php编写网页实例,网页实例:怎么详细介绍用PHP来编写网页记数器
  15. Android性能优化:如何让App更快、更稳、更省(含内存、布局优化等)
  16. js pug 代码_jquery.form.js的使用(基于pug)
  17. 吉林大学高级程序设计(红皮书)(最后几章)
  18. python读excel中的sheet
  19. 软件工程大作业进度报告
  20. [ant design vue] 表单验证成功,提示信息不显示

热门文章

  1. 华为云obs跨域问题
  2. GDUT 寒假排位赛三
  3. win10 家庭版 没有「本地用户和组」
  4. 如何撰写《软件需求规格说明书》
  5. adc0804c语言程序,模数转换ADC0804的应用实例(含源程序及电路)
  6. python怎么更新setuptools_linux 升级python2.7 安装setuptools
  7. winform程序中e.Cancel有什么意义
  8. msbuild 语法_MSBuild 命令行参考
  9. VLAN 0的作用说明
  10. 15-Groovy-日期和时间