题目背景
给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
题目描述
无
输入格式
第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。
输出格式
给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。
输入输出样例
输入 #1
2 2 1
1 1 2 2
1 2
输出 #1
1
import java.util.*;
public class Main {
public static void main(String[] args) {
Main m = new Main();
m.handleInput();
}
int sx = 0;
int sy = 0;
int fx = 0;
int fy = 0;
int sum = 0;
int[][] a = new int[10][10];
int[][] b = new int[10][10];
int[] aa = new int[] { 0, 1, 0, -1 };
int[] bb = new int[] { 1, 0, -1, 0 };
public void handleInput() {
Scanner in = new Scanner(System.in);
int n = 0;
int m = 0;
int t = 0;
if (in.hasNext()) {
n = in.nextInt();
m = in.nextInt();
t = in.nextInt();
}
sx = in.nextInt();
sy = in.nextInt();
fx = in.nextInt();
fy = in.nextInt();
a[sx][sy] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
b[i][j] = 1;
}
}
for (int i = 1; i <= t; i++) {
int a1 = in.nextInt();
int b1 = in.nextInt();
b[a1][b1] = 0;
}
in.close();
dfs(sx, sy);
System.out.println(sum);
}
public void dfs(int x, int y) {
if (x == fx && y == fy) {
sum++;
return;
}
for (int i = 0; i <= 3; i++) {
if (a[x + aa[i]][y + bb[i]] == 0 && b[x + aa[i]][y + bb[i]] == 1) { // 空地为 1, 障碍物为0, 0 行,0 列也为 0,
a[x][y] = 1; // 走过的点打上标记
dfs(x + aa[i], y + bb[i]);
a[x][y] = 0; // 还原状态
}
}
}
}
dfs回溯 ,迷宫的位置的1开始,所以,第0行和第0列,会被搜索到,那么就把值为0 的格子标记为 障碍物,所以 0 行, 0 列为 0,而先把迷宫里的点都标记为1 ,为空地,然后在把空地标记 为 0,