题解
换位置
1 条题解
-
0
解题思路
学生站成一个 n×n 的方阵,编号是从 1 到 n×n,按行一行一行排的:第 1 行是 1、2、…、n,第 2 行是 n+1、n+2、…、2n,依次类推。
所以第 i 行第 j 列站的学生编号就是 (i-1)×n + j。我们先按这个公式把整个方阵填好。
老师喊“a行b列”,要做的就是:
- 记下位置 (a, b) 上的学生,存到临时变量 t;
- 把位置 (b, a) 的学生搬到 (a, b);
- 再把 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