题目背景
给定一个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 ;
}
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
);
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;
}
}
}
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();
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(){
}
}