CSP-J 2024 T2地图探险 题解

CSP-J2024题解 这是因为,set 可以自动去重,去除重复的牌(字符串)后,剩下的字符串就是实际拥有的不同的牌。转移方程:f[i+1][j][t]​=visd[j−1][S[j][t]​​]||visu[j+1][S[j][t]]​​。若 S[j][t]​=1,则f[1][j][t]​=true,否则f[1][j][t]​=false。不难发现有很多8并且是产生火柴最多的数字根据特殊性质发现规律 找出7的倍数和7的倍数+1的n。定义状态g[i][j][t]​表示在第i轮中,能否以第j个数字序列的第t个位置作为终点。 阅读详情

省流:一坨模拟

题面

题目描述

小 A 打算前往一片丛林去探险。丛林的地理环境十分复杂,为了防止迷路,他先派遣了一个机器人前去探路。

丛林的地图可以用一个 n n n 行 m m m 列的字符表来表示。我们将第 i i i 行第 j j j 列的位置的坐标记作 ( i , j ) ( 1 ≤ i ≤ n (i, j)(1 \leq i \leq n (i,j)(1≤i≤n, 1 ≤ j ≤ m ) 1 \leq j \leq m) 1≤j≤m)。如果这个位置的字符为 x \tt x x,即代表这个位置上有障碍,不可通过。反之,若这个位置的字符为 . \tt. .,即代表这个位置是一片空地,可以通过。

这个机器人的状态由位置和朝向两部分组成。其中位置由坐标 ( x , y ) ( 1 ≤ x ≤ n (x, y)(1 \leq x \leq n (x,y)(1≤x≤n, 1 ≤ y ≤ m ) 1 \leq y \leq m) 1≤y≤m) 刻画,它表示机器人处在地图上第 x x x 行第 y y y 列的位置。而朝向用一个 0 ∼ 3 0 \sim 3 0∼3 的整数 d d d 表示,其中 d = 0 d = 0 d=0 代表向东, d = 1 d = 1 d=1 代表向南, d = 2 d = 2 d=2 代表向西, d = 3 d = 3 d=3 代表向北。

初始时,机器人的位置为 ( x 0 , y 0 ) (x_0, y_0) (x0​,y0​),朝向为 d 0 d_0 d0​。保证初始时机器人所在的位置为空地。接下来机器人将要进行 k k k 次操作。每一步,机器人将按照如下的模式操作:

  1. 假设机器人当前处在的位置为 ( x , y ) (x, y) (x,y),朝向为 d d d。则它的方向上的下一步的位置 ( x ′ , y ′ ) (x^′, y^′) (x′,y′) 定义如下:若 d = 0 d = 0 d=0,则令 ( x ′ , y ′ ) = ( x , y + 1 ) (x^′, y^′) = (x, y + 1) (x′,y′)=(x,y+1),若 d = 1 d = 1 d=1,则令 ( x ′ , y ′ ) = ( x + 1 , y ) (x^′, y^′) = (x + 1, y) (x′,y′)=(x+1,y),若 d = 2 d = 2 d=2,则令 ( x ′ , y ′ ) = ( x , y − 1 ) (x^′, y^′) = (x, y - 1) (x′,y′)=(x,y−1),若 d = 3 d = 3 d=3,则令 ( x ′ , y ′ ) = ( x − 1 , y ) (x^′, y^′) = (x - 1, y) (x′,y′)=(x−1,y)。

  2. 接下来,机器人判断它下一步的位置是否在地图内,且是否为空地。具体地说,它判断 ( x ′ , y ′ ) (x^′, y^′) (x′,y′) 是否满足 1 ≤ x ′ ≤ n , 1 ≤ y ′ ≤ m 1 \leq x^′ \leq n, 1 \leq y^′ \leq m 1≤x′≤n,1≤y′≤m,且 ( x ′ , y ′ ) (x^′, y^′) (x′,y′) 位置上是空地。如果条件成立,则机器人会向前走一步。它新的位置变为 ( x ′ , y ′ ) (x^′, y^′) (x′,y′),且朝向不变。如果条件不成立,则它会执行“向右转”操作。也就是说,令 d ′ = ( d + 1 )   m o d   4 d^′ = (d + 1) \bmod 4 d′=(d+1)mod4(即 d + 1 d + 1 d+1 除以 4 4 4 的余数),且它所处的位置保持不变,但朝向由 d d d 变为 d ′ d^′ d′。

小 A 想要知道,在机器人执行完 k k k 步操作之后,地图上所有被机器人经过的位置(包括起始位置)有几个。

输入格式

本题有多组测试数据。

输入的第一行包含一个正整数 T T T,表示数据组数。

接下来包含 T T T 组数据,每组数据的格式如下:

第一行包含三个正整数 n , m , k n, m, k n,m,k。其中 n , m n, m n,m 表示地图的行数和列数, k k k 表示机器人执行操作的次数。

第二行包含两个正整数 x 0 , y 0 x_0, y_0 x0​,y0​ 和一个非负整数 d 0 d_0 d0​。

接下来 n n n 行,每行包含一个长度为 m m m 的字符串。保证字符串中只包含 x \tt{x} x 和 . \tt{.} . 两个字符。其中,第 x x x 行的字符串的第 y y y 个字符代表的位置为 ( x , y ) (x, y) (x,y)。这个位置是 x \tt{x} x 即代表它是障碍,否则代表它是空地。数据保证机器人初始时所在的位置为空地。

输出格式

对于每组数据:输出一行包含一个正整数,表示地图上所有被机器人经过的位置(包括起始位置)的个数。

输入输出样例 #1

输入 #1

2
1 5 4
1 1 2
....x
5 5 20
1 1 0
.....
.xxx.
.x.x.
..xx.
x....

输出 #1

3
13

说明/提示

【样例 1 解释】

该样例包含两组数据。对第一组数据,机器人的状态以如下方式变化:

  1. 初始时,机器人位于位置 ( 1 , 1 ) (1, 1) (1,1),方向朝西(用数字 2 2 2 代表)。
  2. 第一步,机器人发现它下一步的位置 ( 1 , 0 ) (1, 0) (1,0) 不在地图内,因此,它会执行“向右转”操作。此时,它的位置仍然为 ( 1 , 1 ) (1, 1) (1,1),但方向朝北(用数字 3 3 3 代表)。
  3. 第二步,机器人发现它下一步的位置 ( 0 , 1 ) (0, 1) (0,1) 不在地图内,因此,它仍然会执行“向右转”操作。此时,它的位置仍然为 ( 1 , 1 ) (1, 1) (1,1),但方向朝东(用数字 0 0 0 代表)。
  4. 第三步,机器人发现它下一步的位置 ( 1 , 2 ) (1, 2) (1,2) 在地图内,且为空地。因此,它会向东走一步。此时,它的位置变为 ( 1 , 2 ) (1, 2) (1,2),方向仍然朝东。
  5. 第四步,机器人发现它下一步的位置 ( 1 , 3 ) (1, 3) (1,3) 在地图内,且为空地。因此,它会向东走一步。此时,它的位置变为 ( 1 , 3 ) (1, 3) (1,3),方向仍然朝东。

因此,四步之后,机器人经过的位置有三个,分别为 ( 1 , 1 ) , ( 1 , 2 ) , ( 1 , 3 ) (1, 1),(1, 2),(1, 3) (1,1),(1,2),(1,3)。

对第二组数据,机器人依次执行的操作指令为:向东走到 ( 1 , 2 ) (1, 2) (1,2),向东走到 ( 1 , 3 ) (1, 3) (1,3),向东走到 ( 1 , 4 ) (1, 4) (1,4),向东走到 ( 1 , 5 ) (1, 5) (1,5),向右转,向南走到 ( 2 , 5 ) (2, 5) (2,5),向南走到 ( 3 , 5 ) (3, 5) (3,5),向南走到 ( 4 , 5 ) (4, 5) (4,5),向南走到 ( 5 , 5 ) (5, 5) (5,5),向右转,向西走到 ( 5 , 4 ) (5, 4) (5,4),向西走到 ( 5 , 3 ) (5, 3) (5,3),向西走到 ( 5 , 2 ) (5, 2) (5,2),向右转,向北走到 ( 4 , 2 ) (4, 2) (4,2),向右转,向右转,向南走到 ( 5 , 2 ) (5, 2) (5,2),向右转,向右转。

【样例 2】

见选手目录下的 explore/explore2.in 与 explore/explore2.ans。

该样例满足第 3 ∼ 4 3\sim 4 3∼4 个测试点的限制条件。

【样例 3】

见选手目录下的 explore/explore3.in 与 explore/explore3.ans。

该样例满足第 5 5 5 个测试点的限制条件。

【样例 4】

见选手目录下的 explore/explore4.in 与 explore/explore4.ans。

该样例满足第 6 6 6 个测试点的限制条件。

【样例 5】

见选手目录下的 explore/explore5.in 与 explore/explore5.ans。

该样例满足第 8 ∼ 10 8 \sim 10 8∼10 个测试点的限制条件。

【数据范围】

对于所有测试数据,保证: 1 ≤ T ≤ 5 1 \leq T \leq 5 1≤T≤5, 1 ≤ n , m ≤ 10 3 1 \leq n, m \leq 10^3 1≤n,m≤103, 1 ≤ k ≤ 10 6 1 \leq k \leq 10^6 1≤k≤106, 1 ≤ x 0 ≤ n 1 \leq x_0 \leq n 1≤x0​≤n, 1 ≤ y 0 ≤ m 1 \leq y_0 \leq m 1≤y0​≤m, 0 ≤ d 0 ≤ 3 0 \leq d_0 \leq 3 0≤d0​≤3,且机器人的起始位置为空地。

::cute-table{tuack}

测试点编号 n n n m m m k k k特殊性质
1 1 1 = 1 =1 =1 ≤ 2 \leq 2 ≤2 = 1 =1 =1无
2 2 2^^^^
3 3 3 ≤ 10 2 \leq 10^2 ≤102 ≤ 10 2 \leq 10^2 ≤102^^
4 4 4^^^^
5 5 5 = 1 =1 =1 ≤ 10 3 \leq 10^3 ≤103 ≤ 2 × 10 3 \leq 2\times 10^3 ≤2×103地图上所有位置均为空地
6 6 6^^^无
7 7 7 ≤ 10 3 \leq 10^3 ≤103^ ≤ 10 6 \leq 10^6 ≤106地图上所有位置均为空地
8 8 8^^^无
9 9 9^^^^
10 10 10^^^^

题意

模拟机器人的 k k k次操作
规则:

  • 按照方向 d d d, 如果按照这个方向移动一步(具体方式如题)在界内,就移动至这个位置,否则就不移动,令 d = ( d + 1 ) d = (d + 1) d=(d+1) % 4 4 4.

做法

模拟

Code代码

#include <iostream>
#include <string>
using namespace std;
const int MAXN = 1e3 + 5;
int n, m, k, X, Y, D;
bool map[MAXN][MAXN]; // 标记地图上的空地,true表示空地
bool vis[MAXN][MAXN]; // 标记机器人经过的位置

// 方向数组:0-东,1-南,2-西,3-北,分别对应x和y的变化量
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};

// 检查位置(tx, ty)是否合法(在地图内且为空地)
bool check(int tx, int ty) {
    return tx >= 1 && tx <= n && ty >= 1 && ty <= m && map[tx][ty];
}

// 清空地图和访问标记数组
void clear() {
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            map[i][j] = false;
            vis[i][j] = false;
        }
    }
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        cin >> n >> m >> k >> X >> Y >> D;
        clear(); // 清空上一组数据的残留信息!!!!!
        for (int i = 1; i <= n; ++i) {
            string s;
            cin >> s;
            for (int j = 1; j <= m; ++j) {
                map[i][j] = (s[j - 1] == '.');
            }
        }
        int x = X, y = Y, d = D;
        vis[x][y] = true;
        for (int step = 0; step < k; ++step) {
            int tx = x + dx[d]; // 目标位置
            int ty = y + dy[d];
            if (check(tx, ty)) {
                // 合法则移动到新位置,并标记
                x = tx;
                y = ty;
                if (!vis[x][y]) {
                    vis[x][y] = true;
                }
            } else {
                // 不合法向右转
                d = (d + 1) % 4;
            }
        }
        int ans = 0;
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                ans += vis[i][j];
            }
        }
        
        cout << ans << "\n";
    }
    return 0;
}

记录

2024 CSP-J 题解 ​ 题目给出了一整套牌的定义,但是纯粹在扯淡,完全没有必要去判断给出的牌的花色和点数,我们用一个循环来依次读入每一张牌,如果这个牌在之前出现过,我们就让答案减一。这里建议用map、unordered_set或者给每一种牌一个编号,然后用数组存储也可以。 阅读详情

相关推荐

CSP-J系列【2024】P11228 [CSP-J 2024] 地图探险题解

摘要 本文描述了一个机器人丛林探险的模拟问题。给定n×m的字符矩阵表示丛林地图('.'可通行,'x'障碍物),机器人从初始位置(x0,y0)和方向d0出发,执行k次操作:每次尝试沿当前方向移动,若受阻则右转90度。要求统计机器人最终访问过的不同位置总数(含起点)。输入包含T组测试数据,每组包括地图尺寸、操作次数、初始状态和地图信息。输出每组数据中机器人访问过的位置数量。样例展示了机器人在受阻时转向和成功移动的不同情况。算法需要模拟每一步操作,维护位置和方向状态,并用标记数组记录访问轨迹。时间复杂度主要取决于

djy2024的博客 857

CSP-J 2024第二轮 完整题解

本文讲诉了2024CSP-J的四个编程题的解法。T1:用map统计扑克牌种类数,计算补全52张所需的最少牌数。T2:模拟地图探险过程,处理转向和移动操作,统计访问的格子数。T3:根据木棍数n,按规则拼接最小数字,重点讨论n≡3(mod7)等特殊情况。T4:使用动态规划判断能否进行r轮接龙游戏,最后一轮以数字c结尾,处理多轮状态转移和玩家限制条件。

Little_Zyl的博客 1253

2024年CSP-J复赛真题及题解: T2 地图探险

2024年CSP-J复赛真题及题解: T2 地图探险

王老师青少年编程 1073

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

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

applelin的博客 536

[CSP-J 2024] 地图探险-题解

看题。

A09Felix的博客 1402

CSP-J2024入门级T2:地图探险

CSP-J2024入门级T2:地图探险,模拟。

少儿编程乔老师 296

T2[CSP-J 2024]地图探险 (explore)(非官方数据)

对第二组数据,机器人依次执行的操作指令为:向东走到 (1,2),向东走到 (1,3),向东走到 (1,4),向东走到 (1,5),向右转,向南走到 (2,5),向南走到 (3,5),向南走到 (4,5),向南走到 (5,5),向右转,向西走到 (5,4),向西走到 (5,3),向西走到 (5,2),向右转,向北走到 (4,2),向右转,向右转,向南走到 (5,2),向右转,向右转。数据保证机器人初始时所在的位置为空地。因此,四步之后,机器人经过的位置有三个,分别为 (1,1),(1,2),(1,3)。

cowedge的博客 1445

2024 CSP-J2 CSP-S2 第2轮 复赛 真题 讲解、解析(2024.10.27).pdf

2024 CSP-J2 CSP-S2 第2轮 复赛 真题 讲解、解析(2024.10.27)

信息学奥赛一本通 2112:【24CSPJ普及组】地图探险(explore) | 洛谷 P11228 [CSP-J 2024] 地图探险

题目中已经给出了表示方向的方法:整数d表示机器人前进的方向,d = 0 代表向东(右),d = 1 代表向南(下),d = 2 代表向西(左),d = 3 代表向北(上)。在一个矩阵中,当前位置为(sx, sy),将下一个位置与当前位置横纵坐标的差值记到一个数组中,即为方向数组。表示向整数d代表的方向走一步后,新位置和原位置横纵坐标的差值。走一步后新的位置和当前位置横纵坐标的差值,走一步后新的位置和当前位置横纵坐标的差值,走一步后新的位置和当前位置横纵坐标的差值,所以将方向数组声明为。

君义NOIP的博客 1390

2020 CSP-J 入门级 初赛 第一轮 试题与解析 PDF.rar

2020 CSP-J 入门级 初赛 第一轮 试题与解析 PDF.rar

【24CSPJ普及组】地图探险(explore) 测试案例数据包

【24CSPJ普及组】地图探险(explore) 测试案例数据包

CSP2024-J 题解

rp++

christ_lrs的博客 1100

2024CSP-J地图探险解析[代码]

本文提供了2024年CSP-J普及组第二轮试题中第二题“地图探险(explore)”的详细解析及代码实现。题目要求模拟一个探险者在给定地图上的移动过程,地图中存在障碍物,探险者需要根据当前方向判断是否遇到障碍物并调整方向。代码通过二维数组表示地图和行走记录,使用方向数组控制移动方向,并在每次移动后标记已走过的位置。最终统计探险者走过的不同位置数量并输出结果。解析涵盖了输入处理、边界设置、移动逻辑及结果统计等关键步骤,帮助读者理解题目要求和解题思路。

CSP-J2024 T1 - T3 详解 && CSP -J2025 注意事项

本文解析了CSP-J2024考试中T1至T3的题目解法。T1使用桶排统计缺失扑克牌;T2通过DFS实现地图探险,强调多组测试需清空数据;T3采用数学规律解题,针对n模7的不同余数给出相应解法。文章提供了AC代码,适合初学者参考。同时提醒考生注意2025年考试中的这些要点,如基础算法的应用和数学思维的培养。

初心如磐,逐梦前行||b站@一个空客迷 2545

2024CSP-J复赛真题题解-T2:地图探险

2024CSP-J复赛真题题解-T2:地图探险

HttpClient vs OkHttpClient:哪个更适合你的Java项目?(附性能对比实测)

本文深度对比了Apache HttpClient与OkHttpClient在Java项目中的性能表现与适用场景。通过实际性能测试,OkHttp在连接复用、高并发吞吐量及内存占用方面表现更优,尤其适合现代微服务与Spring生态。HttpClient则凭借其高度可配置性,在需要精细控制HTTP协议细节的场景中更具优势。文章提供了清晰的选型指南,帮助开发者根据项目需求做出最佳决策。

onion的博客 508

2024年CSP/J题解

2024年CSP/J题解

我喜欢代码,并不是喜欢代码本身,而是喜欢把心融入代码,找寻其中的真理 1477

顺序功能图基本结构

顺序功能图(Sequential Function Chart,SFC)是一种用于描述工业控制系统中顺序控制流程的图形化编程语言,广泛应用于PLC(可编程逻辑控制器)编程。其核心思想是将复杂的控制流程分解为多个有序的步骤,通过逻辑条件实现步骤间的切换。顺序功能图通过图形化的方式简化了复杂控制逻辑的设计,尤其适用于需要严格顺序控制的工业自动化场景。[初始步] → 转换条件1 → [步1] → 转换条件2 → [步2] → ...[步X] → → [步B] → 转换条件B → → [合并步]

ayingqin1的博客 1224

2024 CSP-J2 CSP-S2 第2轮 复赛 真题 讲解、解析

2024 CSP-J2 CSP-S2 第2轮 复赛 真题 讲解、解析

青少年趣味编程 3317

梯度提升决策树GBDT原理与代码实例讲解

梯度提升决策树GBDT原理与代码实例讲解 1.背景介绍 1.1 机器学习发展历程 机器学习是人工智能领域的一个重要分支,旨在使计算机具备学习和改进自身性能的能力。随着大数据时代的到来,海量的数据为机器学习算法提供了广阔的应用空间。在

AI天才研究院 1080

RK356x U-Boot研究所(命令篇)3.7 pci与nvme命令的用法

RK356x U-Boot研究所(命令篇)3.7 pci与nvme命令的用法

Systemcall名屋 2083

CSP-J 2024 第二轮完整解析

CSP-J 2024 第二轮完整解析

applelin的博客 2118

如何在 Mac 上下载安装 Xcode——并为 iOS 开发更新它原文

下载 Xcode安装命令行工具打开新版本删除文件注意,我在下面的步骤中列出了一些终端命令。这些命令可以被输入到你现在的工作目录中。这意味着你不需要导航到任何特定的文件夹。如果你真的想这样做,你可以在输入下面的步骤中的命令之前先输入== cd==。这将使你返回到主文件夹。

专注于AI领域前沿知识,业余爱好开发软件 4665
上一篇: CSP-J 2024 T1扑克牌题解
Cat.exe
博客等级 码龄1年 16粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值