现有 N*M 由 字符 组成的迷宫 ,字符有四种类型,且不同类型可以执行的指令不同:
“*” 表示此处位置为空地,没有任何限制。可以随便走;
“X” 表示此处位置只能由左方到达,出口不限;
“Y” 表示此处位置只能由上方到达,出口不限;
“#” 表示这个地方有阻碍,不可进入;
已知,你需要从迷宫的左上角出发,到达右下角出口。
条件:你可以每次都能够上下左右移动
问:有多少种方案?
样例:
4 4
*X*#
Y**#
*#*Y
****
输出 4
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int N, M;//行、列
vector<vector<char>>map(25, vector<char>(25));
//坐标移动
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };
//确定走过的路
int used[25][25];
//计数
int num=0;
void dfs(int x,int y)
{
if (x == M-1 && y == N-1)
{
used[x][y] = 1;
num++;
return;
}
for (int i = 0; i < 4; i++)
{
int sx = x + dx[i];
int sy = y + dy[i];
if (sx<0 || sy<0 || sx>N - 1 || sy>M - 1 || used[sx][sy] == 1 || map[sx][sy] == '#')
continue;
if (sx == x + dx[0] && map[sx][sy] == 'X')
{
used[sx][sy] = 1;
dfs( sx, sy);
used[sx][sy] = 0;
}
else if (sy == y + dy[1] && map[sx][sy] == 'Y')
{
used[sx][sy] = 1;
dfs( sx, sy);
used[sx][sy] = 0;
}
else if (map[sx][sy] == '*')
{
used[sx][sy] = 1;
dfs( sx, sy);
used[sx][sy] = 0;
}
else
continue;
}
return;
}
int main()
{
while (cin >> N >> M)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
cin >> map[i][j];
}
}
used[0][0] = 1;
dfs(0,0);
cout << num;
}
return 0;
}