packageMain;importjava.util.Arrays;importjava.util.Scanner;publicclassMain{staticintN=110;staticint n;staticint m;staticint g[][]=newint[N][N];//staticint d[][]=newint[N][N];// dpstaticPII q[]=newPII[N*N];publicstaticintbfs(){int hh =0, tt =0;// 初始化队头和队尾为0
q[0]=newPII(0,0);// 一开始第一个节点入队for(int i =0; i <N; i++){// 将d数组初始化为-1Arrays.fill(d[i],-1);}
d[0][0]=0;// 已经走过(0,0)// 技巧 上右下左int[] dx =newint[]{-1,0,1,0};int[] dy =newint[]{0,1,0,-1};while(hh <= tt){// 队列只要不空PII t = q[hh++];// 每次取出队头元素for(int i =0; i <4; i++){int x1 = t.x + dx[i], y1 = t.y + dy[i];if(x1>=0&&x1<n&&y1>=0&&y1<m&&g[x1][y1]==0&&d[x1][y1]==-1){
d[x1][y1]= d[t.x][t.y]+1;
q[++tt]=newPII(x1,y1);}}}return d[n-1][m-1];}publicstaticvoidmain(String[] args){Scanner scanner =newScanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();for(int i =0; i < n; i++){for(int j =0; j < m; j++){
g[i][j]= scanner.nextInt();}}System.out.println(bfs());}staticclassPII{publicint x;publicint y;publicPII(int x,int y){this.x = x;this.y = y;}}}
用系统的Queue实现更加简单
packageMain;importjava.util.Arrays;importjava.util.LinkedList;importjava.util.Queue;importjava.util.Scanner;publicclassMain{staticintN=110;staticint[][] g =newint[N][N];staticint[][] d =newint[N][N];staticint n, m;// static PII[] q = new PII[N * N]; // 队列,等下尝试用系统队列staticQueue<PII> q2 =newLinkedList<>();publicstaticintbfs(){// int hh = 0, tt = 0;// q[0] = new PII(0,0);
q2.add(newPII(0,0));for(int i =0; i <N; i++){// d数组初始化为-1Arrays.fill(d[i],-1);}
d[0][0]=0;int[] dx =newint[]{-1,0,1,0};int[] dy =newint[]{0,1,0,-1};while(!q2.isEmpty()){// PII t = q[hh++];PII t = q2.poll();for(int i =0; i <4; i++){int x = t.x + dx[i], y = t.y + dy[i];if(x >=0&& x < m && y >=0&& y < n && g[x][y]==0&& d[x][y]==-1){
d[x][y]= d[t.x][t.y]+1;// q[++tt] = new PII(x, y);
q2.add(newPII(x,y));}}}return d[n-1][m-1];}publicstaticvoidmain(String[] args){Scanner scanner =newScanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();for(int i =0; i < n; i++){for(int j =0; j < m; j++){
g[i][j]= scanner.nextInt();}}System.out.println(bfs());}staticclassPII{publicint x;publicint y;publicPII(int x,int y){this.x = x;this.y = y;}}}