栈的应用-迷宫问题

硅谷探秘者 8601 0 0

1.问题描述:

image.png

问题:上面有一个迷宫,灰色部分代表不能通过,白色部分代表可以通过,现在从a点出发,能否找到一条路径到达b点,如果能,输出此路径。


下面采用试探法求解,采用栈结构保存每一步的内容(包括坐标和方向),每前进一步都进行四个方向的试探,如果该方向可以走,就先记录下上一步走过的路径坐标,放进栈中保存,如果四个方向都无法通行,就从栈中取出上一次的路径坐标,换个方向继续试探,直到求解问题。


2.基本算法如下:

        (1)在(1,1)进入迷宫,并向正东(v=1)方向试探。

        (2)监测下一方位(g,h)。若(g,h)=(m,n)且 maze[m,n]=0,则到达出口,输出走过的路径:程序结束。

        (3)若(g,h)≠(m,n),但(g,h)方位能走通且第一次经过则记下这一步,并从(g,h)出发,再向东试探下一步否则仍在(i,j)方位换一个方向试探。

        (4)若(,j方位周围4个方位阻塞或已经过,则需退一步并换一个方位试探。若(i,j)=(1,1)则到达入口,说明迷宫走不通。


3.代码演示:

package problem;
public class State {
	public int i;//当前位置横坐标
	public int j;//当前位置纵坐标
	public int getI() {
		return i;
	}
	public State(int i, int j, int v) {
		super();
		this.i = i;
		this.j = j;
		this.v = v;
	}
	public void setI(int i) {
		this.i = i;
	}
	public int getJ() {
		return j;
	}
	public void setJ(int j) {
		this.j = j;
	}
	public int getV() {
		return v;
	}
	public void setV(int v) {
		this.v = v;
	}
	public int v;//当前方向
}
package problem;
import java.util.Stack;
/**
 * 栈的应用-迷宫问题
 * @author LENOVO
 *
 */
public class Maze {
	private static int maze[][];//代表迷宫矩阵
	private static int mark[][];//标记该坐标是否已经走过
	private static int move[][];//方向上的增量(包括四个方向)
	
	public static void main(String[] args) {
		move= new int[][] {{0,0},{0,1},{1,0},{0,-1},{-1,0}};
		mark=new int[7][7];
		maze=new int[][]{{1,1,1,1,1,1,1},
						 {1,0,0,1,1,0,1},
						 {1,1,0,0,0,0,1},
						 {1,1,1,0,1,1,1},
						 {1,1,1,0,0,0,1},
						 {1,1,1,0,1,0,1},
						 {1,1,1,1,1,1,1}};
		maze();
	}
	/**
	 * 试探
	 */
	public static void maze() {
		//栈,用于保存走每一步的信息,包括每一步的坐标和方向
		Stack<State> stack=new Stack<State>();
		State s=new State(1, 1, 1);
		mark[1][1]=1;
		do {
			int g=s.i+move[s.v][0],h=s.j+move[s.v][1];
			if((g==5&&h==5)&&maze[5][5]==0) {//找到出口
				System.out.println("找到出口");
				Stack<State> s_=new Stack<State>();
				stack.add(s);
				while(!stack.isEmpty()) {
					s_.add(stack.pop());
				}
				while(!s_.isEmpty()) {
					State l=s_.pop();
					System.out.println("坐标:"+l.getI()+"-"+l.getJ());
				}
				return;
			}
			if(maze[g][h]==0&&mark[g][h]==0) {//可以向前走
				mark[g][h]=1;
				stack.add(s);
				s=new State(g,h,1);
			}else if(s.v<4) {//换个方向试探
				s.v++;
			}else {//无路可走,返回一步,从栈中取出记录的数据
				while(s.v>=4&&!stack.isEmpty()) {
					s=stack.pop();
					s.v++;
				}
			}
		}while(!stack.isEmpty()&&s.v<=4);//栈不为空,并且还有方向可以试探,则继续试探
		System.out.println("没有找到出口");
	}
}


move二维数组  的含义是:

横坐标代表方向:1-向右,2-向下,3-向左,4-向上,0-无意义

纵坐标代表位置坐标:0-横坐标,1-纵坐标

值代表该位置上的增量:比如:

    move[1,0]=0代表:横坐标向左不变

    move[1,1]=1代表:纵坐标向右走1个单位



评论区
请写下您的评论...
暂无评论...
猜你喜欢
数据结构与算法 4082 !DOCTYPEhtmlhtml head metacharset="UTF-8" title/title script varflag=true; window.onload
数据结构与算法 9453 -寻找最短路径算法:广度优先搜索数据结构:队列,链表代码实现:!DOCTYPEhtmlhtml head metacharset="UTF-8" title/title script
数据结构与算法 1704 -表达式求值1.概念:表达式包括{前缀表达式(波兰式)、中缀表达式、后缀表达式(逆波兰式)}例如:(a+b)*(a-b) 前缀表达式:*+ab-ab 中缀表达式:(a+b)*(a-b) 后缀
数据结构与算法 9222 描述思路:典型广度优先搜索算法,根据字典序大小,可以确定遍历循序,因为字典序DLRU,所以对于每一个节点优先先往下走,然后向左走,然后向右走,然后向上走。则最后首先到达出口一条路径就是符合
算法基础 1141 今天在项目中遇到"|"分割字符串,如果直接使下面方式,不会按照我们预想分割:String[]ids="12|13|14".split("|");分割出来是[1,2,|,1,3,|1,4
java虚拟机(jvm) 7011 指针引,所以一般这部分使内存相对较小,而且当方法调完成以后帧中占内存即可被回收。影响java虚拟机最大深度因素有那些1.Java虚拟机大小直接影响深度2.在java虚拟机
java基础 7637 多线程带来:线程有时候回和其他线程共享一些资源,比如内存、数据库等。当多个线程同时读写同一份共享资源时候,可能会发生冲突。这时候,我们就需要引入线程“同步”机制,即各位线程之间要有顺序使
数据库 1194 是这种写法却隐藏着较深使陷阱。在排序字段有数据重复情况下,会很容易出现排序结果与预期不一致。一、案例mysql版本:mysqlselectversion
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1 2024-08  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript 加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。