题目描述
张三是一个玩迷宫的高手,天下还没有能难住他的迷宫。但是总有人喜欢刁难蒜头君,不停的给张三出难题。这个出题的人很聪明,他知道天下还没有能难住张三的迷宫。
所以他便转换思维问张三,在不走重复路径的情况下,总共有多少不同可以到达终点的路径呢?张三稍加思索便给出了答案,你要不要也来挑战一下?
输入格式
第一行输入两个整数
n(1 ≤ n ≤ 11), m(1 ≤ m ≤ 11)
,表示迷宫的行和列。然后有一个
n × m
的地图,地图由'.'
、'#'、's'、'e'
这四个部分组成。'.'
表示可以通行的路,'#'
表示迷宫的墙,'s'
表示起始点,'e'
表示终点。输出格式
输出一个整数,表示从
's'
到达'e'
的所有方案数。输入样例1
输入
- 3 3
- ##s
- #..
- e.#
输出
- 1
输入样例2
输入
- 3 3
- ##s
- ...
- e.#
输出
- 2
输入样例3
输入
- 5 5
- s####
- .####
- .####
- .####
- ....e
输出
- 1
输入样例4
输入
- 5 5
- s####
- .####
- .####
- .####
- ..##e
输出
- 0
输入样例5
输入
- 6 6
- s...##
- .#..##
- .#..##
- .#....
- .#....
- .....e
输出
- 357
思路
深度搜索搜到终点e的时候,就方案数+1,因为有上下左右四个方向,就往这四个方向递归。
代码
import java.util.*;
public class Main {
static char[][] atlas;
static int h, w, sum = 0;
public static void fun(int i, int j) {
if (atlas[i][j] == '#' || atlas[i][j] == 'k')
return;
if (atlas[i][j] == 'e') {
sum++;
return;
}
atlas[i][j] = 'k';
if (i + 1 < h) //下
fun(i + 1, j);
if (i > 0) //下
fun(i - 1, j);
if (j + 1 < w) //右
fun(i, j + 1);
if (j > 0) //左
fun(i, j - 1);
atlas[i][j] = '.';
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
h = scanner.nextInt();
w = scanner.nextInt();
atlas = new char[h][w];
for (int i = 0; i < h; i++) {
System.out.print("输入第" + i + 1 + "行:");
String str = scanner.next();
for (int j = 0; j < w; j++) {
atlas[i][j] = str.charAt(j);
}
}
for (int i = 0; i < w; i++) {
if (atlas[0][i] == 's')
fun(0, i);
}
System.out.println(sum);
}
}