题目背景
给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
输入格式
第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。
输出格式
给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。
import java.util.*;
public class Main {
static int N,M,T,SX,SY,FX,FY;
static int key[][];
static boolean a[][];
static int count = 0;
static int xx[] = new int[]{0,0,-1,1};
static int yy[] = new int[]{-1,1,0,0};
static void dfs(int x,int y){
if(x < 1 || x > N || y < 1 || y > M)// 出界
return;
if(a[x][y]) // false已经走过
return;
for(int i = 0;i < T;i++)
if(x == key[i][0] && y == key[i][1]) // 为障碍点
return;
if(x == FX && y == FY){ // 到达终点
count++;
return;
}
for(int i = 0;i <= 3;i++){
a[x][y] = true;
dfs(x+xx[i],y+yy[i]);//下一个节点
a[x][y] = false;
}
}
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
N = sc.nextInt();//行
M = sc.nextInt();//列
a = new boolean[N+1][M+1];//地图大小尽量开大
for(int i = 1;i <= N;i++)//初始化地图每个位置为false
for(int j = 1;j <= M;j++)
a[i][j] = false;
T = sc.nextInt();//障碍物个数
key = new int[T][2];
SX = sc.nextInt();//起始位置
SY = sc.nextInt();
FX = sc.nextInt();//终止位置
FY = sc.nextInt();
for(int i = 0;i < T;i++){//存放障碍物的坐标
key[i][0] = sc.nextInt();
key[i][1] = sc.nextInt();
}
dfs(SX,SY);//从起始坐标开始搜索
System.out.println(count);
}
}