1 条题解
-
0
练63.3 迂回方阵
解题思路
从左下角扩成方形。第k层先沿距底k的行从左到右填0~k列,再沿第k列往下填其余位置。每层终点为右下角(k+1)²。
正确性说明
依题目给出的对应关系逐项处理,位置与原输入保持明确对应。每一步完成当前项的全部贡献,结束后得到所有位置或字符的目标结果。
易错点
本题不是通常螺旋;样例各层是先水平向右再竖直向下。
复杂度
时间O(n²),空间O(n²)。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<vector<int>> a(n, vector<int>(n)); int v = 1; for (int k = 0; k < n; k++) { int row = n - 1 - k; for (int j = 0; j <= k; j++) a[row][j] = v++; for (int i = row + 1; i < n; i++) a[i][k] = v++; } for (auto &r : a) { for (int x : r) cout << setw(4) << x; cout << "\n"; } return 0; }
- 1