核心思路
利用深搜dfs实现对不同路径的遍历,并在到达终点时给路径计数器+1即可。
DFS设计流程
结束条件:当到达地图右下角最后一个坐标x=m-1,y=n-1时,即可统计路径,并返回。
下一层dfs坐标设计:
定义方向数组dx=「1,0」;dy=「0,1」,两轮for循环遍历所可能的坐标。
当遇到边界或者障碍或者之前走过,就直接continue进入下一轮的for循环重新选坐标。
否则标记下一轮要走的坐标为已走过,并进入下一轮dfs。
回溯:取消标记下一轮要走的坐标。
代码细节
import java.util.Scanner;
public class Main{
static int m,n;
static int[] dx={1,0};
static int[] dy={0,1};
static int cnt=0;
public static void dfs(int x,int y,int[][] map){
if (x==m-1&&y==n-1){
cnt++;
return;
}
for (int i = 0; i < 2; i++) {
int nx=x+dx[i];
int ny=y+dy[i];
if (nx<0||ny<0||nx>m-1||ny>n-1||map[nx][ny]==1){
continue;
}
map[nx][ny]=1;
dfs(nx,ny,map);
map[nx][ny]=0;
}
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
m= scanner.nextInt();//行
n= scanner.nextInt();//列
int[][] map=new int[m][n];
scanner.nextLine();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
map[i][j]= scanner.nextInt();
}
}
dfs(0,0,map);
System.out.println(cnt);
}
}