宽度优先搜索算法-广度优先搜索

以某点为中心,向四周扩散搜索,直到找到结果为止。
利用该算法搜索迷宫从起点到终点的最优路径.

假设有一个上图的迷宫,1表示该点是通路,可以通过,-1表示该点有障碍,不能通过。红色表示迷宫的起点和终点。以上图为例,坐标0:0就是起点,坐标2:3就是终点.

从起点开始,往外扩展,直到找到终点位置.
程序设计:

设计flag布尔型数组,用来表示对应的迷宫的格子是否已经访问过,值为false,表示对应的迷宫的格子没有访问过,访问过之后,改为true。

设计step二维数组,分别表示以某点为中心,周围4个点的下标的变化

Cell类表示迷宫的一个格子,x和y表示格子的坐标,stepCount表示到达该格子的步数,pre表示到达该格子之前的格子.

listCell队列,用来保存目前正访问的迷宫的格子.
代码:
cell.java
package com.wanmait;
public class Cell {
private int x;//格子的坐标
private int y;
private int stepCount;//第几步
private Cell pre;//上一个格子
public Cell(int x,int y,int stepCount) {
this.x = x;
this.y = y;
this.stepCount = stepCount;
}
public void setPre(Cell pre)
{
this.pre = pre;
}
public Cell getPre() {
return this.pre;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getStepCount() {
return stepCount;
}
public void setStepCount(int stepCount) {
this.stepCount = stepCount;
}
}Demo.java
package com.wanmait;
import java.util.LinkedList;
public class Demo {
private int map[][];//地图 1 表示可以行走 -1 表示不能走
private int startx,starty,endx,endy;//起点下标 终点下标
private boolean flag[][];//标记对应的点是否走过
private int step[][] = {{0,1},{0,-1},{1,0},{-1,0}};//某个格子周围4个格子的坐标变化的值
//显示从起点到终点的最有路径的格子的坐标
public void showPath(Cell cell) {
System.out.println(cell.getX()+":"+cell.getY());
if(cell.getPre()!=null) {
this.showPath(cell.getPre());
}
}
//x和y起点坐标
public void go(int x,int y)
{
Cell cell = new Cell(x,y,0);//起点
LinkedList<Cell> listCell = new LinkedList<>();//保存经过的格子
listCell.add(cell);//起点保存到队列
flag[x][y] = true;
boolean f = false;//是否到达终点
while(!listCell.isEmpty()) {
Cell first = listCell.getFirst();//取队列的第一个元素
if(first.getX()==endx&&first.getY()==endy)//到达终点
{
System.out.println("步数:"+first.getStepCount());
this.showPath(first);
f = true;
break;
}
//first格子的周围4个格子
for (int i = 0; i < 4; i++)
{
int newx = first.getX()+step[i][0];
int newy = first.getY()+step[i][1];
int stepCount = first.getStepCount()+1;
if(newx<0||newx>4||newy<0||newy>3)
{
continue;
}
if(map[newx][newy]==1&&flag[newx][newy]==false) {
Cell temp = new Cell(newx,newy,stepCount);
temp.setPre(first);
listCell.add(temp);
flag[newx][newy] = true;
}
}
listCell.removeFirst();
}
if(f==false) {
System.out.println("无法到达终点");
}
}
//初始化
public void init()
{
flag = new boolean[5][4];
map = new int[5][4];
map[0] = new int[] {1,1,-1,1};
map[1] = new int[] {1,-1,1,1};
map[2] = new int[] {1,1,-1,1};
map[3] = new int[] {1,-1,1,1};
map[4] = new int[] {1,1,1,-1};
startx = 0;
starty = 0;
endx = 2;
endy = 3;
}
}main
package com.wanmait;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo demo = new Demo();
demo.init();
demo.go(0, 0);
}
}

0条评论
点击登录参与评论