一、判断是否可达
队列问题
public class BFS判断是否可达 {
static boolean arrive=false;
static char[][] map={{'S','.','*','.'},
{'.','.','.','.'},
{'*','*','*','T'}};
static int[][] vis=new int[1000][1000];
static int n=map.length; //行
static int m=map[0].length;//列
static int[][] dist= {{0,-1},{0,1},{-1,0},{1,0}};
static Queue<Node> q=new LinkedList<>();
static class Node{
private int x;
private int y;
private int step;
public Node(int x, int y, int step) {
super();
this.x = x;
this.y = y;
this.step = step;
}
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 getStep() {
return step;
}
public void setStep(int step) {
this.step = step;
}
}
static void bfs() {
Node s=new Node(0,0,0);
q.add(s);
while(!q.isEmpty()) {
Node t=q.poll();
int x=t.getX();
int y=t.getY();
int step=t.getStep();
vis[x][y]=1;
if(map[x][y]=='T') {
arrive=true;
break;
}
for(int i=0;i<4;i++) {
int nx=x+dist[i][0];
int ny=y+dist[i][1];
if(nx>=0&&ny>=0&&nx<n&&ny<m&&vis[nx][ny]==0&&(map[nx][ny]=='T'||map[nx][ny]=='.')) {
q.add(new Node(nx,ny,step+1));
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
bfs();
if(arrive)
System.out.println("Yes");
else
System.out.println("No");
}
}
二、输出路径
用Node[ ]数组存路径
public class BFS输出路径 {
static char[][] map={{'S','.','*','.'},{'.','.','.','.'},{'*','*','*','T'}};
static int[][] vis=new int[1000][1000];
static int n=map.length; //行
static int m=map[0].length;//列
static int[][] dist= {{0,-1},{0,1},{-1,0},{1,0}};
static Queue<Node> q=new LinkedList<>();
static Node[] ans=new Node[105];
static class Node{
private int x;
private int y;
private int step;
public Node(int x, int y, int step) {
super();
this.x = x;
this.y = y;
this.step = step;
}
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 getStep() {
return step;
}
public void setStep(int step) {
this.step = step;
}
}
static void bfs() {
Node start =new Node(0,0,0);
q.offer(start);
ans[start.step]=start;
while(!q.isEmpty()) {
Node poll=q.poll();//出队
int x=poll.getX();
int y=poll.getY();
int step=poll.getStep();
if(map[x][y]=='T') {
for(int i=0;i<step;i++) {
System.out.println("("+ans[i].getX()+","+ans[i].getY()+')');
}
System.out.println("("+(n-1)+","+(m-1)+')');
break;
}
for(int i=0;i<4;i++) {
int xx=x+dist[i][0];
int yy=y+dist[i][1];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&vis[xx][yy]==0&&(map[xx][yy]=='.'||map[xx][yy]=='T')) {
vis[x][y]=1; //标记
ans[step+1]=new Node(xx,yy,step+1);
q.offer(new Node(xx,yy,step+1));
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
bfs();
}
}