1 条题解

  • 0
    @ 2025-8-24 21:14:31

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Maxmilite
    **

    搬运于2025-08-24 21:14:30,当前版本为作者最后更新于2023-01-05 21:33:50,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    [语言月赛202301] 华小科的旅行开始了 题解

    Source & Knowledge

    2023 年 1 月语言月赛,由洛谷网校入门计划/基础计划提供。

    文字题解

    题目大意

    给定 n,mn, m,起点以及「任务指引」。华小课从 (sx,sy)(s _ x, s _ y) 出发,当当前点任务指引为 (0,0)(0, 0) 时代表旅程停止,否则前往当前点任务指引所指的点。依次输出从旅程开始到旅程停止访问的各个点。

    解析

    使用 n×2mn \times 2m 的数组来存储本题的坐标可能会在计算下标等等方面比较麻烦。这里提供一种比较方便的存储数据的方式。

    std::pair 可以将 2 个数据组合成 1 个数据并进行储存。它的实现是一个结构体,主要的两个成员变量是 firstsecond

    具体的,使用时,我们可以使用 pair<?, ?> 设立变量。这里的 ? 可以替换为 int 等数据类型。建立时,可以使用 make_pair(?, ?) 函数。这里的 ? 需要替换为对应的变量。访问时,直接访问 pair 变量.firstpair 变量.second 即可。

    使用例:

    using namespace std;
    pair<int, int> a = make_pair(3, 4);
    cout << a.first << " " << a.second << endl;
    

    输出结果为 3 4

    当然,我们同样可以用一个自定义的结构体实现相同的功能。

    struct Pair { int first, second; };
    

    在后续的代码中,同样引用成员变量 firstsecond 即可。


    对于坐标的存储,我们可以使用 pair 类型的数组来记录。

    #define pii pair<int, int>
    pii a[1005][1005];
    for (int i = 1; i <= n; ++i) {
    	for (int j = 1; j <= m; ++j) {
    		cin >> a[i][j].first >> a[i][j].second;
    	}
    }
    

    在访问时,我们使用两个 int 变量 x, y 记录当前位置,使用 while 语句进行遍历输出即可。

    每一次,我们读取到 a[x][y] 所存储的 pair 类型变量 v,并将 x 赋值为 v.first,将 y 赋值为 v.second 即可。循环的终止条件为 x, y00

    核心代码如下:

    int x = sx, y = sy;
    while (x && y) {
    	cout << x << " " << y << endl;
    	pii cur = a[x][y];
    	x = cur.first, y = cur.second;
    }
    

    视频题解

    完整代码请在视频中查看。

    • 1

    [语言月赛202301] 华小科的旅行开始了

    信息

    ID
    8242
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者