top1编程
← 返回题目
题解

换位置

1 条题解

  • 0
    @ 2026-8-5 0:56:09

    解题思路

    学生站成一个 n×n 的方阵,编号是从 1 到 n×n,按行一行一行排的:第 1 行是 1、2、…、n,第 2 行是 n+1、n+2、…、2n,依次类推。

    所以第 i 行第 j 列站的学生编号就是 (i-1)×n + j。我们先按这个公式把整个方阵填好。

    老师喊“a行b列”,要做的就是:

    1. 记下位置 (a, b) 上的学生,存到临时变量 t;
    2. 把位置 (b, a) 的学生搬到 (a, b);
    3. 再把 t(原来的 (a, b) 学生)放到 (b, a)。

    这就是最经典的三变量交换:甲想和乙换位置,先找个空位让甲站过去,乙再站到甲原来的位置,最后甲从空位站到乙原来的位置。

    最后把整个方阵按行输出,两个数字之间用空格隔开。

    参考代码

    // P4456 换位置:按行编号1~n*n填入方阵,交换(a,b)与(b,a)两个位置的学生后输出
    #include <iostream>
    using namespace std;
    
    int a[10][10]; // 方阵
    
    int main() {
        int n, x, y;
        cin >> n;
        // 第i行第j列站的学生编号 = (i-1)*n + j
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                a[i][j] = (i - 1) * n + j;
        cin >> x >> y; // 老师喊的a行b列
        int t = a[x][y];     // 交换位置(x,y)和(y,x)
        a[x][y] = a[y][x];
        a[y][x] = t;
        for (int i = 1; i <= n; i++) {   // 输出交换后的方阵
            for (int j = 1; j <= n; j++) {
                if (j > 1) cout << " ";
                cout << a[i][j];
            }
            cout << endl;
        }
        return 0;
    }
    

    复杂度分析

    • 填方阵要 n×n 次,输出方阵也要 n×n 次,时间复杂度是 O(n²)。
    • 需要存下整个方阵,空间复杂度是 O(n²)。题目说 n<10,数组开 10×10 就够用了。
    • 1