走迷宫问题(广度优先搜索) --- 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 # 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漂流の少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值