题目:输入一个n行m列的矩阵,每个单元格要么是空地用1表示,要么是障碍物用0表示;
写出从起点0,0到终点2,2的最短路径移动序列,其中UDLR分别表示往上、下、左、右移动。
代码:
package diliuzhang;
import java.util.Scanner;
import javax.naming.directory.DirContext;
public class ZouMiGongBFS {
static int m;
static int n;
static int[] q=new int[4000];
static int[][] vis=new int[20][20];
static int[][] last_dir=new int[20][20];
static int[][] fa=new int[20][20];
static int[][] dist=new int[20][20];
static int[] dx={1,0,-1,0};
static int[] dy={0,1,0,-1};
static int[] dir=new int[4000];
static char[] name={'D','R','U','L'};
static int[][] maze=null;
public static void main(String[] agrs){
Scanner inScanner=new Scanner(System.in);
n=inScanner.nextInt();
m=inScanner.nextInt();
maze=new int[n][m];
for (int i = 0; i <n; i++) {
for (int j = 0; j <m; j++) {
maze[i][j]=inScanner.nextInt();
}
}
bfs(0, 0);
print_bath(2,2);
}
public static void print_bath(int x, int y) {
// TODO Auto-generated method stub
int c=0;
for (; ; ) {
int fx=fa[x][y]/m;
int fy=fa[x][y]%m;
if (fx==x&&fy==y) {
break;
}
dir[c++]=last_dir[x][y];
x=fx;
y=fy;
}
while(c-->0){
System.out.println(name[dir[c]]);
}
}
public static void bfs(int x, int y) {
// TODO Auto-generated method stub
int front=0,rear=0,d,u;
u=x*m+y;
vis[x][y]=1;
fa[x][y]=u;
dist[x][y]=0;
q[rear++]=u;
while(front<rear){
u=q[front++];
x=u/m;
y=u%m;
for ( d = 0; d < 4; d++) {
int nx=x+dx[d];
int ny=y+dy[d];
if (nx>=0&&nx<n&&ny>=0&&ny<m&&maze[nx][ny]!=0&&vis[nx][ny]==0) {
int v=nx*m+ny;
q[rear++]=v;
vis[nx][ny]=1;
fa[nx][ny]=u;
dist[nx][ny]=dist[x][y]+1;
last_dir[nx][ny]=d;
}
}
}
}
}