头像

Cyan

四川成都

深度强化学习炼丹师

2019第十届蓝桥杯国赛-E路径计数

2019第十届蓝桥杯国赛-E路径计数

2021-07-03 · 66次阅读 · 原创 · 数据结构与算法

题面

【问题描述】

从一个 5x5 的方格矩阵的左上角出发,沿着方格的边走,满足以下条件的路线有多少种?

  • 总长度不超过 12;
  • 最后回到左上角;
  • 路线不自交;
  • 不走出 5x5 的方格矩阵范围之外。

如下图所示,ABC 是三种合法的路线。注意 B 和 C 由于方向不同,所以视为不同的路线。

RoadCount.png

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路

暴力dfs。从起点(0,0)出发有又回到起点,走的步数小于等于12,则只要我从起点出发后能在11步以内再回到起点右边或者下面的那个点,那就算一种合法方案。

这里在每一步保存了上一步的坐标,是因为若从(0,0)出发,向右走到达(0,1),若不加判断前一步不是起点则会认为这是一种合法方案(该方案(0,0)->(0,1)->(0,0),产生自交,不合法),必须是走出去后再回到(0,1)点才行,所以记录了前一步的位置,(1,0)也同理。

答案:206

代码

#include<iostream> using namespace std; const int N = 10; bool v[N][N]; int res = 0, n = 6; int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; void dfs(int i, int j, int pi, int pj, int s) { //这里步数s小于等于 11 的原因是,我只要到了起点右边和下边的这两个点,那我就能走最后固定的一步到起点。 if (s <= 11 && i == 0 && j == 1 && !(pi == 0 && pj == 0)) { //前一步不是起点(0,0),又回到(0,1)坐标,则为一种方法 res++; return; } if (s <= 11 && i == 1 && j == 0 && !(pi == 0 && pj == 0)) { //前一步不是起点(0,0),又回到(1,0)坐标,则为一种方法 res++; return; } if(s == 12) return; for (int d = 0; d < 4; d++) { int ti = i + dir[d][0], tj = j + dir[d][1]; if (ti < 0 || ti >= n || tj < 0 || tj >= n) continue; if (v[ti][tj]) continue; v[ti][tj] = true; dfs(ti, tj, i, j, s + 1); v[ti][tj] = false; } } int main() { dfs(0, 0, -1, -1, 0); cout << res << endl; return 0; }

标题: 2019第十届蓝桥杯国赛-E路径计数
链接: https://www.fightingok.cn/detail/116
更新: 2022-09-18 22:40:13
版权: 本文采用 CC BY-NC-SA 3.0 CN 协议进行许可