走迷宫问题(广度优先搜索) --- 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实现的主要内容,如果未能解决你的问题,请参考以下文章