题解
左拐角方阵
1 条题解
-
0
解题思路
把 n×n 的方阵想象成一层一层的“拐角”叠在一起:
最外面那一圈“拐角”是最大的拐角,它是“最下面一行 + 最左边一列”,按题目要求最外层是男生,用 0 表示。再往里一层是女生,用 1 表示;再往里又是 0……就这样 0、1、0、1 交替出现。
那么关键问题是:怎么知道某个格子在第几层拐角?
看这个格子离“最下面”有多远(距离 = n - i),再看它离“最左边”有多远(距离 = j - 1)。哪边近,就说明它属于哪一层,所以取两个距离中较小的那一个,就是它所在的层数(最外层是第 0 层)。
- 第 0 层输出 0(男生)
- 第 1 层输出 1(女生)
- 第 2 层又输出 0……
- 也就是:输出 层数 % 2
用样例 n=4 验证一下:第 1 行第 2 列的格子,离左边距离 1、离下边距离 3,取小者 1,输出 1;第 4 行任意一列,离下边距离都是 0,输出 0。和样例输出完全一样!
参考代码
// 左拐角方阵:最外层"拐角"(最底行+最左列)是男生0,往里一层是女生1,依次交替 // 规律:第i行第j列的格子离最外层拐角的层数 = min(离左边距离j-1, 离下边距离n-i) #include <iostream> using namespace std; int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { // i是行号,从上往下1~n for (int j = 1; j <= n; j++) { // j是列号,从左往右1~n int l = j - 1; // 离左边缘的距离(第0层是最左列) int b = n - i; // 离下边缘的距离(第0层是最底行) int d = l < b ? l : b; // 取较小者=所在拐角层数 if (j > 1) cout << ' '; // 数字之间用空格隔开 cout << (d % 2); // 第0层是男生0,交替出现 } cout << endl; } return 0; }复杂度分析
方阵共有 n×n 个格子,两层循环把每个格子算一遍并输出,所以时间复杂度是 O(n²)。只用了几个 int 变量,空间复杂度是 O(1)。
- 1