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 #