题目背景
给定一个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
说明/提示
【数据规模】
1≤N,M≤5
题解(java语言)
import java.util.Scanner;
public class Main {
static point start;
static point end;
static point[] zb;
static int[][]vis;
static int[] xx = {0,0,-1,1};
static int[] yy = {-1,1,0,0};
static int N ;
static int M;
static int ans = 0;
static public void dfs(point p){
//越界跳出
if(p.x<0 || p.x>M-1 || p.y<0 || p.y>N-1){
return ;
}
//当前点等于终点 记数++,并结束当前函数
if(p.x == end.x && p.y == end.y){
ans++;
return ;
}
//4个方向查找
for(int i=0;i<4;i++){
int dx = p.x + xx[i];
int dy = p.y + yy[i];
point po = new point(dx,dy);
//vis的值 0表示可以访问 1和2表示不能访问
if( dx>-1 && dx<=M-1 && dy>-1 && dy<=N-1 && vis[dx][dy] ==0 ){
//标记这个点被访问了
vis[dx][dy] = 1;
dfs(po);
//函数回调 标记这个点已经无效 下次可以访问
vis[dx][dy] = 0;
}
}
}
//第一行N、M和T,N为行,M为列,T为障碍总数。
//第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
N = in.nextInt();
M = in .nextInt();
int T = in.nextInt();
vis = new int[N][M];
start = new point();
end = new point();
//-1 是为了和数组下表对应
start.x = in.nextInt()-1;
start.y = in.nextInt()-1;
end.x = in.nextInt()-1;
end.y = in.nextInt()-1;
zb = new point[T];
for(int i=0;i<T;i++){
point pi = new point();
pi.x = in.nextInt();
pi.y = in.nextInt();
zb[i] = pi;
vis[(pi.x)-1][(pi.y)-1] = 2;
}
vis[start.x][start.y] = 1;
dfs(start);
System.out.println(ans);
}
}
//自定义点类
class point{
int x;
int y;
public point(int a,int b){
x=a;
y=b;
}
public point(){
}
}