迷宫问题:利用BFS打印出从起点到终点的路径(java版)

来源:互联网 发布:推送重贴标签算法 编辑:程序博客网 时间:2024/05/02 02:45

题目:输入一个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 stubint 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 stubint 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;}}}}}


0 0
原创粉丝点击