题目出处点这里
思路:深度优先搜索,走不通就返回上一步接着找,走法有上下左右四种方案,代码很简单
package search;
import java.util.Scanner;
public class P1605 {
static int N, M, T, SX, SY, FX, FY, sum;// sum代表方案总数
static int[][] chess;//表示棋盘
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
T = sc.nextInt();
SX = sc.nextInt();
SY = sc.nextInt();
FX = sc.nextInt();
FY = sc.nextInt();
chess = new int[N + 1][M + 1];
for (int i = 0; i < N + 1; i++) {
chess[i][0] = 1;// 第一列置为障碍
chess[0][i] = 1;// 第一行置为障碍
}
for (int i = 0; i < T; i++) {
chess[sc.nextInt()][sc.nextInt()] = 1;// 1代表障碍
}
dfs(SX, SY);
System.out.println(sum);
}
/**
*
* @param row 起点的行
* @param col 终点的列
*/
public static void dfs(int row, int col) {
chess[row][col] = 2;// 先把当前所在点置为访问过
if (chess[FX][FY] == 2) {// 2代表访问过
sum++;// 每成功一次sum++
chess[FX][FY] = 0;//每当走得通就把终点重新置为0(也就是没访问过)
return;//返回
}
// 四种方法 上、下、左、右
// 只有每一种方法不超出棋盘范围,无障碍,没被走过,才可以行得通
if (row - 1 >= 1 && chess[row - 1][col] == 0) {// 上
dfs(row - 1, col);
}
if (row + 1 <= N && chess[row + 1][col] == 0) {// 下
dfs(row + 1, col);
}
if (col - 1 >= 1 && chess[row][col - 1] == 0) {// 左
dfs(row, col - 1);
}
if (col + 1 <= M && chess[row][col + 1] == 0) {// 右
dfs(row, col + 1);
}
chess[row][col] = 0;//每一种走法走完过后,都要将当前所在点置为0(也就是重新设置为没走过),因为有可能另一种走法也要用到此点
}
}