测试用例:
//5 5 矩阵m n
//1 0 起点x y
//3 3 终点x y
//2 障碍物个数
//2 2 障碍物1坐标
//2 1 障碍物2坐标
import java.util.Scanner;
//5 5 矩阵m n
//1 0 起点x y
//3 3 终点x y
//2 障碍物个数
//2 2 障碍物1坐标
//2 1 障碍物2坐标
public class HWB {
static int[][] move ={{0,-1},{-1,0},{0,1},{1,0}};
static int minPath = 999999;
static int minPathCount = 0;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt(); //矩阵行数
int n = in.nextInt(); //矩阵列数
int[][] map = new int[m][n];
int[][] visited = new int[m][n];
int[] startPoint = new int[2]; //起点
startPoint[0] = in.nextInt();
startPoint[1] = in.nextInt();
map[startPoint[0]][startPoint[1]] = 1;
int[] endPoint = new int[2]; //终点
endPoint[0] = in.nextInt();
endPoint[1] = in.nextInt();
map[endPoint[0]][endPoint[1]] = 1;
int lakeNum = in.nextInt(); //山湖个数
for(int i = 0; i < lakeNum; i++){
int row = in.nextInt();
int col = in.nextInt();
map[row][col] = 9;
}
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}
int path = 0;
visited[startPoint[0]][startPoint[1]] = 1;
dfs(startPoint[0],startPoint[1],endPoint,path,map,visited);
dfs2(startPoint[0],startPoint[1],endPoint,path,map,visited);
System.out.println("\n"+minPathCount+" "+minPath+"\n");
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
System.out.print(visited[i][j]+" ");
}
System.out.println();
}
}
//求最短路径
public static void dfs(int x, int y, int[] end,int path,int[][] map,int[][] visited) {
//递归返回条件
if(x==end[0] && y==end[1]){
if(path<minPath){
minPath = path;
}
return;
}
for(int i=0;i<move.length;i++){
int moveX = x+ move[i][0];
int moveY = y+ move[i][1];
//越界判断
if(moveX<0 || moveX>=map.length || moveY<0 || moveY>=map.length) continue;
//判断是否有山湖(障碍物),和是否访问过
if(map[moveX][moveY]!=9 && visited[moveX][moveY]!=1){
visited[moveX][moveY] = 1;
dfs(moveX,moveY,end,path+1,map,visited);
visited[moveX][moveY] = 0;
}
}
}
//求最短路径个数
public static void dfs2(int x, int y, int[] end,int path,int[][] map,int[][] visited) {
//递归返回条件
if(x==end[0] && y==end[1]){
if(path==minPath){
minPathCount++;
}
return;
}
for(int i=0;i<move.length;i++){
int moveX = x+ move[i][0];
int moveY = y+ move[i][1];
//越界判断
if(moveX<0 || moveX>=map.length || moveY<0 || moveY>=map.length) continue;
//判断是否有山湖(障碍物),和是否访问过
if(map[moveX][moveY]!=9 && visited[moveX][moveY]!=1){
visited[moveX][moveY] = 1;
dfs2(moveX,moveY,end,path+1,map,visited);
visited[moveX][moveY] = 0;
}
}
}
}