NEUOJ网格路径
在一个 7×7 的网格中,从左上方的方格走到左下方的方格,共有 88418 条路径。每条路径对应一个由字符 D(向下)、U(向上)、L(向左)和 R(向右)组成的 48 字符描述。
例如,路径
对应于描述 DRURRRRRDDDLUULDDDLDRRURDDLLLLLURULURRUULDLLDDDD。
现在给你一个路径的描述,其中可能包含字符 ?(表示任意方向)。你的任务是计算与该描述匹配的路径数量。
输入
唯一的输入行包含一个 48 个字符组成的字符串,字符可以是 ?、D、U、L 和 R。
输出
输出一个整数:匹配描述的路径总数。
输入样例
??????R??????U??????????????????????????LD????D?
输出样例
201
输入样例
DRURRRRRDDDLUULDDDLDRRURDDLLLLLURULURRUULDLLDDDD
输出样例
1
解题思路:
1、首先考虑爆搜,但是状态很多,对于?
很多的情况一定会超时。
2、对搜索进行剪枝:
- (1)当前点四周被包围且不是终点时,剪枝。
- (2)对于一个
凹
字形的访问路径,则下一步一定向凹
中间走,具体形式化为:若当前点的上下区域被访问过且左右区域未被访问,或左右区域被访问且上下区域未被访问,则进行剪枝。
这里仅给出搜索过程,仅供参考
void dfs(int u, int v, int depth)
{if (depth == 48) {if (u == n && v == 1) ans++;return;}if (u == n && v == 1) return;if (check(u, v)) return;char req = s[depth];for (int i = 0; i < 4; i++) {if (req != '?' && req != dir[i]) continue;int x = u + dx[i], y = v + dy[i];if (x < 1 || x > n || y < 1 || y > n || vis[x][y]) continue;vis[x][y] = 1;dfs(x, y, depth + 1);vis[x][y] = 0;}
}