CSP-J 2024 T2 地图探险【题解】

CSP-J 2024 T2 地图探险

题目大意

有一片丛林,其环境可以用一个二维数组表示:

  • .代表此地为空地,可走。
  • x代表此地非空地,不可走。

有一个机器人探路,他的状态分为两个值:

  • 位置。
  • 方向。

机器人探路有这样一些规则:

  • 若前方有路,直接往前走(不管是否走过)。
  • 遇到障碍物,右转。

现在给出机器人的初始状态(一定在空地),求执行k次操作之后,机器人经过了多少地方(右转算一次操作,前进算一次操作)。

思路

需要的变量 / 数组

描述机器人状态需要的3个变量:

  • x:位置。
  • y:位置。
  • d:朝向(0~3)。

vis数组:

  • 当机器人走过[x, y],vis[x][y] = true

dir数组:

  • dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}
  • [x + dir[d][0], y + dir[d][1]]表示当机器人朝向为d时往前走一步之后的位置。
  • d = 0: 右 (0, 1)。
  • d = 1: 下 (1, 0)。
  • d = 2: 左 (0, -1)。
  • d = 3: 上 (-1, 0)。

核心思想

vis[x][y] = true;
while (k--) {
    int nx = x + dir[d][0], ny = y + dir[d][1]; // 计算下一步的位置
    if (!(nx >= 1 && nx <= n && ny >= 1 && ny <= m && mp[nx][ny] == '.')) { // 是否能走
        d = (d + 1) % 4; // 若不能走 右转
        continue;
    }
    x = nx, y = ny; // 若能走 更新
    vis[nx][ny] = true;
}

代码

#include <iostream>
#include <cstring>
using namespace std;

const int N = 1e3 + 5;

int n, m, k, x, y, d, dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
char mp[N][N];
bool vis[N][N];


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

        vis[x][y] = true;
        while (k--) {
            int nx = x + dir[d][0], ny = y + dir[d][1];
            if (!(nx >= 1 && nx <= n && ny >= 1 && ny <= m && mp[nx][ny] == '.')) {
                d = (d + 1) % 4;
                continue;
            }
            x = nx, y = ny;
            vis[nx][ny] = true;
        }
        int ans = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (vis[i][j] == true)
                    ans++;
            }
        }
        cout << ans << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值