TB椰程 TypeBuddy 打字搭子

2024 地图探险 · 方案二 方向数组

CSP-J 标程 · 复赛真题 · 代码 · cpp · 难度 2/5 · 共 1417 字

用 dx、dy 两个数组统一处理四个方向

  • 2024
  • 模拟

正文

// CSP-J 2024 复赛 T2 · 地图探险(方案二)
// 原题:https://oj.yecheng.tv/p/ccf-CSPJ2024B
//
// 方案二 · 用方向数组 dx / dy
// 把四个方向的坐标增量装进两个数组,下标正好就是朝向编号:
//   dx = {0, 1, 0, -1},dy = {1, 0, -1, 0}  分别对应东、南、西、北。
// 这样走一步只需要 nx = x + dx[d]、ny = y + dy[d] 两行,
// 右转也统一写成 d = (d + 1) % 4,代码短一大截,也不容易写错方向。
// 这是所有网格类模拟题的通用套路,非常值得记住。

#include <bits/stdc++.h>
using namespace std;

char mp[1005][1005];
bool vis[1005][1005];
int dx[4] = {0, 1, 0, -1};      // 东、南、西、北
int dy[4] = {1, 0, -1, 0};

int main() {
    freopen("explore.in", "r", stdin);
    freopen("explore.out", "w", stdout);

    int T;
    cin >> T;
    while (T--) {
        int n, m, k;
        cin >> n >> m >> k;
        int x, y, d;
        cin >> x >> y >> d;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                cin >> mp[i][j];
                vis[i][j] = false;
            }
        }

        vis[x][y] = true;
        int ans = 1;
        while (k--) {
            int nx = x + dx[d];
            int ny = y + dy[d];
            if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && mp[nx][ny] == '.') {
                x = nx;
                y = ny;
                if (!vis[x][y]) {
                    vis[x][y] = true;
                    ans++;
                }
            } else {
                d = (d + 1) % 4;               // 右转:朝向编号加一取模
            }
        }
        cout << ans << "\n";
    }
    return 0;
}

CSP-J 标程 · 复赛真题的其它内容

打字首页 · 词库画廊 · 编程打字 · 指法入门 · 天梯榜 · 数据分析 · 班级课堂 · 关于我们
椰程 TypeBuddy 打字搭子 —— 键盘指法练习 · 单词记忆 · 班级课堂 · 在线 PK