[程序员代码面试指南]数组和矩阵-求最短通路值(BFS)

题意

给二维矩阵 1、0组成,问从左上角到右下角的最短通路值。

题解

BFS基础。头节点入队;对队内每个节点判断、处理,符合条件的入队;到了终点节点返回。

相关知识

Queue为接口,LinkedList为该接口的一个实现。

代码

public class Main {
	public static void main(String args[]) {
		int m[][]= {{1,0,1,1,1},{1,0,1,0,1},{1,1,1,0,1},{0,0,0,0,1}};
		int ans=minPathVal(m);
		System.out.println(ans);
	}
	
	public static int minPathVal(int[][] m) {
		if(m==null) {
			return 0;
		}
		
		int[][] dis=new int[m.length][m[0].length];
		dis[0][0]=1;
		Queue<Integer> rQ=new LinkedList<>();//
		Queue<Integer> cQ=new LinkedList<>();
		rQ.add(0);
		cQ.add(0);
		
		int res=0;
		int r;
		int c;
		int dx[]={0,0,-1,1};//
		int dy[]= {-1,1,0,0};
		while(!rQ.isEmpty()) {
			r=rQ.poll();
			c=cQ.poll();
			
			if(r==m.length-1&&c==m[0].length-1) {
				return dis[r][c];
			}
			for(int i=0;i<4;++i) {
				int x=r+dx[i];
				int y=c+dy[i];
				
				if(check(x,y,m,dis)) {
					dis[x][y]=dis[r][c]+1;
					rQ.add(x);
					cQ.add(y);
				}
			}
		}
		return res;
	}
	
	public static boolean check(int x,int y,int[][] m,int[][] dis) {
		return x>=0&&x<m.length&&y>=0&&y<m[0].length&&m[x][y]==1&&dis[x][y]==0;
	}
}