题解
右拐角方阵
1 条题解
-
0
解题思路
这道题不用真的开一个二维数组,只要找到每个格子应该写 0 还是 1 的规律,就能直接输出。
1. “拐角”是什么意思?
想象把方阵从左上角开始,一层一层往里圈。第 1 层是左上角那一个格子(最小的拐角),第 2 层是它外面围成的“L”形(2 行 2 列那一片),第 3 层再往外一圈……就像切洋葱一样。
2. 每个格子属于第几层?
位于第 i 行第 j 列的格子,属于第 max(i,j) 层。为什么?因为格子越往右下角走,它离左上角就越远。比如第 3 行第 2 列,max(3,2)=3,它就在第 3 层。
3. 男生女生怎么交替?
题目说:最小的拐角(第 1 层)一定是男生(0),然后 0、1、0、1 交替。所以:
- 第 1、3、5……层(奇数层)输出 0;
- 第 2、4、6……层(偶数层)输出 1。
也就是看 max(i,j) 是奇数还是偶数。
4. 对照样例
当 n=4 时:
0 1 0 1 1 1 0 1 0 0 0 1 1 1 1 1第 1 层只有 (1,1) 是 0;第 2 层是第 1 行第 2 列、第 2 行的格子,全是 1;第 3 层全是 0;第 4 层(最外圈)全是 1。和我们的规律完全一致!
参考代码
#include <iostream> using namespace std; int main(){ // P4521 右拐角方阵:按“拐角层”交替输出 0/1,最小拐角(第1层)是男生0 int n; cin >> n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int layer = (i > j ? i : j); // 取 i,j 中较大的数,就是所在的拐角层 cout << (layer%2==1 ? 0 : 1); // 奇数层输出0(男生),偶数层输出1(女生) if(j<n) cout << " "; // 两个数字之间用空格隔开 } cout << endl; // 每行结束换行 } return 0; }复杂度分析
方阵一共有 n 行 n 列,也就是 n² 个格子。我们对每个格子只做一次判断并输出,所以时间复杂度是 O(n²)。题目说 3<n<20,n 最大是 19,最多 19×19=361 个格子,瞬间就能算完。
程序没有开数组,只用了一个变量存 n 和每个格子的层数,空间复杂度是 O(1)。
- 1