简单搜索题求助
  • 板块题目总版
  • 楼主lzy20091001
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/12/15 23:03
  • 上次更新2023/12/16 10:41:11
查看原帖
简单搜索题求助
932039
lzy20091001楼主2023/12/15 23:03

题目链接

对每个三角形直接用行列进行标号,列号奇数为绿色,列号偶数为红色,判断相邻的三角形是否相邻然后进行 DFS。

样例已过,且调试结果显示走的路径是对的,但只有 n≤2n \le 2 的 30 分,其他全部 RE 与 WA。求助!

测评记录

#include <iostream>

int n, ans;

bool ct[1000005][5], vis[1005]; // ct 存储每个三角形与相邻的三角形是否连接, vis 为 dfs 时判重

int mp(int i, int j) // 将每个点从行列坐标映射到一维
{
    return (i - 1) * (i - 1) + j;
}

void dfs(int i, int j) // i, j 分别为横纵坐标
{
    if (vis[mp(i, j)]) // 判重
        return;
    vis[mp(i, j)] = true;
    ans++;
    // std::cout << i << " " << j << "\n";
    if (j % 2 == 1) // 绿色三角形
    {
        if (ct[mp(i, j)][0])
            dfs(i, j + 1);
        if (ct[mp(i, j)][1])
            dfs(i + 1, j + 1);
        if (ct[mp(i, j)][2])
            dfs(i, j - 1);
    }
    else // 红色三角形
    {
        if (ct[mp(i, j)][0])
            dfs(i, j - 1);
        if (ct[mp(i, j)][1])
            dfs(i - 1, j - 1);
        if (ct[mp(i, j)][2])
            dfs(i, j + 1);
    }
}

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

    std::cin >> n;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j < 2 * i; j += 2)
        {
            int x;
            std::cin >> x;
            ct[mp(i, j)][0] = ct[mp(i, j + 1)][0] = x & 1;     // 绿色三角与右边相连, 红色三角与左边相连
            ct[mp(i, j)][1] = ct[mp(i + 1, j + 1)][1] = x & 2; // 绿色三角与下面相连, 红色三角与上面相连
            ct[mp(i, j)][2] = ct[mp(i, j - 1)][2] = x & 4;     // 绿色三角与左边相连, 红色三角与右边相连
        }

    dfs(1, 1);

    std::cout << ans << "\n";

    return 0;
}
2023/12/15 23:03
加载中...