走迷宫问题(广度优先搜索) --- java实现

Posted So istes immer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了走迷宫问题(广度优先搜索) --- java实现相关的知识,希望对你有一定的参考价值。

1.问题

迷宫是许多小方格构成的矩形,在每个小方格中有的是墙(用“1”表示)有的是路(用“0”表示)。走迷宫就是从一个小方格沿上、下、左、右四个方向到邻近的方格,当然不能穿墙。设迷宫的入口是在左上角(1,1),出口是右下角(8,8)。根据给定的迷宫,找出一条从入口到出口的路径。

2.代码

Main.java

import java.util.ArrayList;
import java.util.Scanner;

public class Main 
	static int[][] maze = new int[9][9];					   // 记录迷宫
	static boolean[][] visited = new boolean[9][9];            // 记录是否被访问,默认值为false
	static ArrayList<Mypoint> queue = new ArrayList<Mypoint>();// 用动态数组模拟队列
	static int[][] dir =  -1, 0, 1, 0, 0, 1, 0, -1 ; // 表示左、右、上、下 
	
	public static void main(String[] args) 
		Scanner s = new Scanner(System.in);
		System.out.println("8x8迷宫输入:");
		for(int i = 1; i < 9; i++) 
			for(int j = 1; j < 9; j++) 
				maze[i][j] = s.nextInt();
			
		
		search();
		s.close();
	
	
	public static void search() 
		maze[1][1] = 2;     //入口方格赋值为2
		Mypoint start = new Mypoint(1,1);
		queue.add(start);   //入口入队
		while(!queue.isEmpty()) 
			Mypoint first = queue.get(0);  //得到队首元素
			//四个方向开始搜索
			for(int i = 0; i < dir.length; ++i) 
				Mypoint temp = new Mypoint(first.x+dir[i][0],first.y+dir[i][1],first);
				//判断走得通,且不越界
				if(temp.x >= 1 && temp.x <= 8 && temp.y >= 1 && temp.y <= 8 
					&& maze[temp.x][temp.y] == 0 && visited[temp.x][temp.y] == false) 
					//判断当前是否是出口
					if(temp.x == 8 && temp.y == 8) 
						markPath(temp);
						printPath();
						return;
					
					//走得通但不是出口,记录已经访问,入队
					visited[temp.x][temp.y] = true;
					queue.add(temp);
				
			
			queue.remove(0); //队首元素出队
		
	
	
	// 从出口开始往前推,标记路径,路径上的方格值赋为2
	public static void markPath(Mypoint p) 
		maze[p.x][p.y] = 2;
	    if ( p.x == 1 && p.y == 1 )
	        return;
	    else
	        markPath(p.pre);
	    
	
	
	// 打印路径
	public static void printPath() 
		System.out.println("走出迷宫的路径:");
		for (int i=1;i<9;++i)
	        for (int j=1;j<9;++j)
	            if (maze[i][j] == 2) System.out.print("# ");
	            else System.out.print("o ");
	        
	        System.out.println();
	    
	


// 每一个格子定义为Mypoint类
class Mypoint
	int x,y;
	Mypoint pre;  // 记录自己所在路径中的上一个方格
	public Mypoint(int x, int y, Mypoint pre) 
		this.x = x;
		this.y = y;
		this.pre = pre;
	
	public Mypoint(int x, int y) 
		this.x = x;
		this.y = y;
	
;

3.测试输出

8x8迷宫输入:
0 0 0 0 0 0 0 0
0 1 1 1 1 0 1 0
0 0 0 0 1 0 1 0
0 1 0 0 0 0 1 0
0 1 0 1 1 0 1 0
0 1 0 0 0 0 1 1
0 1 0 0 1 0 0 0
0 1 1 1 1 1 1 0
走出迷宫的路径:
# o o o o o o o 
# o o o o o o o 
# # # o o o o o 
o o # o o o o o 
o o # o o o o o 
o o # # # # o o 
o o o o o # # # 
o o o o o o o # 

以上是关于走迷宫问题(广度优先搜索) --- java实现的主要内容,如果未能解决你的问题,请参考以下文章

算法浅谈——走迷宫问题与广度优先搜索

走迷宫之广度优先搜索

[算法与数据结构] 走迷宫问题(广度与深度优先搜索)

迷宫问题的求解(广度优先搜索)

ybt 1252 广度优先搜索 走迷宫(二维最小步数)

广度优先搜索-迷宫问题