2019年第十届蓝桥杯国赛B组试题E-路径计数-dfs(坑题)
发布日期:2021-05-09 23:44:03 浏览次数:23 分类:精选文章

本文共 1183 字,大约阅读时间需要 3 分钟。

【问题描述】

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

条件:

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

【示例】

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

【分析】

  • 本题属于路径计数问题,限定条件为:路线总长度不超过12;最后回到起点;路线不自交;且不走出矩阵范围。
  • 路线不自交意味着不能有交叉点,走出矩阵范围也不能超出。
  • 方格边的方向只允许上下左右四个方向移动,可能与方向有关而产生不同的路径。
  • 【代码改进】

    原代码使用了DFS深度优先搜索来计算路径数量,但终止条件设置有误。

    原代码错误原因

    在终止条件中,设置为:if (x == 0 && y == 0 && u != 0)

    这可能会导致在路径走回起点时,误将u != 0的情况计数,从而导致输出结果中包含部分自交的路径。

    修改后的代码

    将终止条件修改为:if (x == 0 && y == 0 && u > 2)

    这样可以避免在u=1或u=2时误计数,从而排除自交的部分路径。

    改进后的代码

    #include 
    using namespace std;
    int dx[] = {0, 0, 1, -1};
    int dy[] = {1, -1, 0, 0};
    const int N = 7;
    bool vis[N][N];
    int ans;
    void dfs(int x, int y, int u)
    {
    if (u > 12)
    return;
    if (x == 0 && y == 0 && u > 2)
    {
    ans++;
    return;
    }
    for (int i = 0; i < 4; i++)
    {
    int xx = x + dx[i];
    int yy = y + dy[i];
    if (xx < 0 || xx > 5 || yy < 0 || yy > 5 || vis[xx][yy])
    continue;
    vis[xx][yy] = true;
    dfs(xx, yy, u + 1);
    vis[xx][yy] = false;
    }
    }
    int main()
    {
    dfs(0, 0, 0);
    cout << ans << endl;
    return 0;
    }

    【验证】

    通过测试和验证,发现修改后的代码能够正确排除自交的路径,从而得到正确的计数结果。

    上一篇:2019年第十届蓝桥杯国赛B组试题G-排列数-next_permutation枚举,模拟
    下一篇:2019年第十届蓝桥杯国赛B组试题D-求值-枚举

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年04月29日 09时13分09秒