迷宫大家都知道是可以用通过dfs(深度优先算法)进行解决,现在问题如下:小明参加了一个迷宫游戏,这个游戏有这样一个规则:小明只能向上下左右方向任意走n步(可以走回头路),现在需要知道这任意的n步所能覆盖的点的范围和这n步所有的路径

基本原理

经过推理,任意走n步(可以走回头路)有一个规律,那就是所有点构成的图形是一个旋转45度的正方形,如下图所示

并且从图上可以发现一个规律就是不管从哪个点走,走n步后走到的点的个数为(n+1)^2, 经过测试这个规律是正确的。
那么现在问题又来了,如何去获取这些点的坐标和所有到达的路径呢?

获取点的坐标【难度:简单】

思路如下:

  1. 输入坐标(x,y)和要走的步数
  2. 利用递归实现上下左右四个方向随意走动的功能,每走一步步数减一
  3. 当步数为0时输出当前的点的坐标

代码如下:

/*** 深度遍历某一个位置走nbStep后的点坐标* @param x  初始时的横坐标,注意这里为二维数组的第二维度* @param y  初始时的纵坐标,注意这里为二维数组的第一维度* @param nbStep 第几步* direction 方向 ( 规定 1- 向右,2-向下, 3-向左,4-向上)* @return 所到达的点坐标集合*/public static List<String> DFSResult(int x, int y, int nbStep) {List<String> result = DFSResult(x, y, nbStep, new ArrayList<String>());return result;}private static List<String> DFSResult(int x, int y, int nbStep, List<String> result) {if (nbStep == 0) {String res = "(" + x + "," + y + ")";if (!result.contains(res)) {result.add(res);}return result;}int nextX = 0, nextY = 0;for (int direction = 1; direction < 5; direction++) {switch(direction) {case 1: nextX = x + 1; nextY = y; break;case 2: nextX = x; nextY = y + 1; break;case 3: nextX = x - 1; nextY = y; break;case 4: nextX = x; nextY = y - 1; break;}DFSResult(nextX,nextY, nbStep - 1, result);}return result;}

输入:
原点坐标(4,4)
要走的步数 2

输出:

(6,4)
(5,5)
(4,4)
(5,3)
(4,6)
(3,5)
(2,4)
(3,3)
(4,2)

获取所有到达的路径【难度:困难】

思路:

  1. 利用stack(栈)的先进后出原理存储每个路径上的点
  2. 每次走一步前将要到达的点存入stack中
  3. 当前节点上下左右都递归完毕后就返回前一节点继续后续的递归,这里要pop一下

代码如下:

/*** 深度遍历某一个位置走nbStep后的路径* @param x  初始时的横坐标,注意这里为二维数组的第二维度* @param y  初始时的纵坐标,注意这里为二维数组的第一维度* @param nbStep 第几步* direction 方向 ( 规定 1- 向右,2-向下, 3-向左,4-向上)*///node 为路径上的节点private class Node{int x;int y;public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public Node(int x, int y) {super();this.x = x;this.y = y;}@Overridepublic String toString() {return "Node [x=" + x + ", y=" + y + "]";}}//用栈存放路径的节点private static Stack<Node> stackNode = new Stack<>();private static List<String> DFSRoute(int x, int y, int nbStep) {List<String> res = new ArrayList<>(); // 返回结果// 如果是最后一个位置就返回路径if (nbStep == 0) {StringBuilder sb = new StringBuilder();for (int i = 0; i < stackNode.size(); i++) {Node node = stackNode.get(i);if (i == stackNode.size() - 1) {sb.append("(" + node.getX() + "," + node.getY() + ")");} else {sb.append("(" + node.getX() + "," + node.getY() + ") => ");}}res.add(sb.toString());        stackNode.pop(); //弹出最后一个元素return res;}Node node = new Path().new Node(x, y);if (stackNode.size() == 0) {stackNode.push(node);}int nextX = 0, nextY = 0;// 前后左右走一遍for (int direction = 1; direction < 5; direction++) {switch(direction) {case 1: nextX = x + 1; nextY = y; break;case 2: nextX = x; nextY = y + 1; break;case 3: nextX = x - 1; nextY = y; break;case 4: nextX = x; nextY = y - 1; break;}// 将将要走上的点存入stack中Node node1 = new Path().new Node(nextX, nextY);stackNode.push(node1);//开启下一个递归,将结果保存在res中res.addAll(DFSRoute(nextX,nextY, nbStep - 1));}// 关键点:每次前后左右都走了一遍后就返回前一节点stackNode.pop();return res;}

输入:
原点坐标(4,4)
要走的步数 2

输出:

(4,4) => (5,4) => (6,4)
(4,4) => (5,4) => (5,5)
(4,4) => (5,4) => (4,4)
(4,4) => (5,4) => (5,3)
(4,4) => (4,5) => (5,5)
(4,4) => (4,5) => (4,6)
(4,4) => (4,5) => (3,5)
(4,4) => (4,5) => (4,4)
(4,4) => (3,4) => (4,4)
(4,4) => (3,4) => (3,5)
(4,4) => (3,4) => (2,4)
(4,4) => (3,4) => (3,3)
(4,4) => (4,3) => (5,3)
(4,4) => (4,3) => (4,4)
(4,4) => (4,3) => (3,3)
(4,4) => (4,3) => (4,2)

写的不足之处欢迎指出,也欢迎联系我qq:271527068

算法题之迷宫中任意位置走任意长度的所有路径查询【原创题,非官方题目】相关推荐

  1. 【JS】教你如何在对象内任意位置插入任意属性

    [JS]教你如何在对象内任意位置插入任意属性 如果你不知道我写这篇文章的目的是什么,那不妨想想这样一个场景 var obj = {a: "A",c: "C",d ...

  2. cad指北针lisp_cad中可画任意位置,任意方向的指北针的LISP程序

    2014-05-09 回答 写了一个,图如下: autolisp代码如下: (defun c:tes ( / &ang1 &ang2 &dis1 &ent1 & ...

  3. 回溯算法经典问题-迷宫问题

    迷宫问题是一道经典的回溯算法问题,给定一个迷宫矩阵,矩阵中的1表示障碍,0表示可走通路,给定迷宫入口出口,要求寻找从入口穿过迷宫到达出口的所有路径,有则输出,无则给出提示.一本合格的数据结构教科书一般 ...

  4. C语言字符串中最后一个单词的长度的算法(附完整源码)

    C语言字符串中最后一个单词的长度的算法 C语言字符串中最后一个单词的长度的算法完整源码(定义,实现,main函数测试) C语言字符串中最后一个单词的长度的算法完整源码(定义,实现,main函数测试) ...

  5. bmp图片显示(任意位置任意大小)

    文章目录 前言 图片显示 1.普通全屏(800*480)显示bmp 2.在任意位置显示任意大小bmp图片 头文件 前言 Linux系统,GEC6818,800*480,bmp图片 图片显示 由文件IO ...

  6. 计算机图形学实验——三维迷宫的创建及走迷宫过程中的交互功能的实现

    计算机图形学实验2 三维迷宫的创建及走迷宫过程中的交互功能的实现 OpenGL三维迷宫创建及交互 三维"图元"的绘制 迷宫结构的储存 视角转换的实现 碰撞检测 纹理贴图 小结 Op ...

  7. 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。

    今天和大家分享一道2009年代码为408的一道真题: 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链 ...

  8. [迷宫中的算法实践]迷宫生成算法——Prim算法

    普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)), ...

  9. 【吉大刘大有数据结构绿皮书】已知非空线性链表第一个结点由list指出,写一算法,交换p所指结点与其下一个结点在链表中的位置(设p指向的不是链表最后的那个结点)。

    题目 已知非空线性链表第一个结点由list指出,写一算法,交换p所指结点与其下一个结点在链表中的位置(设p指向的不是链表最后的那个结点). 思路及解答 本题要求的是在无头链表中交换p结点和p-> ...

最新文章

  1. Mysql 解决1251- Client does not support authentication protocol requested by server...的问题
  2. visual studio 2019配置OnnxRuntime+推理+vgg16
  3. 开源IT从业者最受欢迎5大技能
  4. 加密锁 vs. 云授权
  5. Java 8 Optional 类
  6. react动画库_React 2020动画库
  7. The operation cannot be completed. See the details.
  8. [Python] zeros(r, c)和ones(r, c)和eye(n) 生成特殊矩阵
  9. 小型超市网上购物系统开发项目总结
  10. ae万能弹性表达式_18种常用AE表达式解析【建议收藏】
  11. 云计算中网络基础知识(升级版)
  12. C语言全局变量,局部变量,静态局部变量的区分
  13. 如何在php设置背景颜色,html如何设置背景颜色?两种方法教会你
  14. 《辛雷学习方法》读书笔记——前言
  15. idea怎么进行c语言编程_idea编写c语言
  16. oracle数据库连接非常慢,sqlplus很快,用客户端就很慢,十几秒才好
  17. 真无线蓝牙耳机哪个品牌好?2023年真无线降噪耳机盘点
  18. 身体质量指数程序,入门写死的小程序项目
  19. 【陈工笔记】# latex中如何将图片并排处理 #
  20. 竞赛打卡:糖尿病遗传风险检测挑战赛

热门文章

  1. 第一节人工智能课堂感悟
  2. 当低代码遇上私有化部署,真是赞爆了!
  3. 消息中间件RabbitMQ核心1
  4. 车牌定位之MSER — 文本检测
  5. TVS二极管SMBJ18CA 丝印标识BET SMB封装 1500W功率
  6. 靶场攻略 | 网络安全靶场合集
  7. 大学计算机课教学特色,大学计算机基础课程教学探讨
  8. 痞子衡嵌入式:理解i.MXRT中FlexSPI外设lookupTable里配置访问行列混合寻址Memory的参数值...
  9. Microsoft Office Word 遇到问题需要关闭。我们对此引起的不便表示抱歉。
  10. 云计算应用越来越广泛,云计算用户需要注意的主要趋势有哪些?