top1编程
← 返回题目
题解

谜题

1 条题解

  • 0
    @ 2026-8-5 10:24:13

    解题思路

    这个谜题其实就是一个移动交换的模拟过程,我们只要照着指令一步步做就行。

    第一步,先在 5×5 的网格里找到星号 * 现在在哪个格子,记下它的行号 x 和列号 y。

    第二步,一条一条地执行指令,一共有 4 种:

    • A:把星号往上移一行,行号 x 减 1;
    • B:把星号往下移一行,行号 x 加 1;
    • L:把星号往左移一列,列号 y 减 1;
    • R:把星号往右移一列,列号 y 加 1。

    每次移动,星号都会和它要去的那个格子交换内容:原来格子里的字母跑到星号原来的位置,星号跑到那个格子。所以移动后,格子里的字母就换了个位置,而星号跟着移动了一步。

    题目保证指令都是合法的,不会让星号移出网格,所以不用担心越界。

    第三步,把移动完的网格一行一行、一列一列地输出出来,每个字符之间用一个空格隔开。

    参考代码

    // P4518 谜题:在5x5网格中根据指令移动星号,与相邻格子交换
    #include <iostream>
    using namespace std;
    
    int main() {
        char g[5][5];
        for (int i = 0; i < 5; i++)
            for (int j = 0; j < 5; j++)
                cin >> g[i][j];
        char s[6];
        cin >> s;
        // 找到星号的位置
        int x = 0, y = 0;
        for (int i = 0; i < 5; i++)
            for (int j = 0; j < 5; j++)
                if (g[i][j] == '*') { x = i; y = j; }
        // 逐条执行指令
        for (int k = 0; s[k]; k++) {
            int nx = x, ny = y;
            if (s[k] == 'A') nx--;      // A:向上移动一行
            else if (s[k] == 'B') nx++; // B:向下移动一行
            else if (s[k] == 'L') ny--; // L:向左移动一列
            else if (s[k] == 'R') ny++; // R:向右移动一列
            // 星号与目标格子的内容交换
            char t = g[x][y];
            g[x][y] = g[nx][ny];
            g[nx][ny] = t;
            x = nx;
            y = ny;
        }
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (j) cout << ' ';
                cout << g[i][j];
            }
            cout << endl;
        }
        return 0;
    }
    

    复杂度分析

    网格固定是 5×5,指令固定是 5 条,所以无论做什么操作,次数都是常数,时间复杂度是 O(1),空间复杂度也是 O(1)。

    • 1