1 条题解

  • 0
    @ 2026-10-26 22:50:07

    思路与算法

    按东南西北的方向编码逐次尝试前进;越界或障碍只右转不移动,用位置布尔数组统计曾到达的不同格子。

    正确性说明

    每步由当前状态唯一决定,直接按两个分支更新与题面一致。起始格先标记,此后只在进入此前未到达格时加1,因此访问统计无重无漏。

    复杂度

    每组O(nm+k)时间、O(nm)空间,含地图输入与访问数组清零;T组串行。

    易错点

    转向本身消耗一次操作;方向0是东,和其他巡检题的北起编码不同。起点也计入。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int T;
        cin >> T;
        while (T--) {
            int n, m, k, x, y, d;
            cin >> n >> m >> k >> x >> y >> d;
            --x;
            --y;
            vector<string> g(n);
            for (auto &s : g)
                cin >> s;
            vector<unsigned char> seen(n * m);
            seen[x * m + y] = 1;
            int ans = 1, dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
            while (k--) {
                int a = x + dx[d], b = y + dy[d];
                if (a < 0 || a >= n || b < 0 || b >= m || g[a][b] == 'x')
                    d = (d + 1) % 4;
                else {
                    x = a;
                    y = b;
                    if (!seen[x * m + y]) {
                        seen[x * m + y] = 1;
                        ans++;
                    }
                }
            }
            cout << ans << "\n";
        }
    }
    
    • 1

    【24CSPJ普及组】地图探险(explore)

    信息

    ID
    1924
    时间
    1000ms
    内存
    128MiB
    难度
    进阶
    标签
    递交数
    0
    已通过
    0
    上传者