题目描述
输入整数N,输出一个N阶的回字形二维数组。
数组的最外层为1,次外层为2,以此类推。
算法
方阵的对称性
用对称性解释如何对输出取值。
以5阶为例,从1开始 $i,j$ 为两层循环的索引,这里取值为min(i,j)
时,输出如下,可以看出数值沿主对角线从小到大递增。
1 1 1 1 1
1 2 2 2 2
1 2 3 3 3
1 2 3 4 4
1 2 3 4 5
取值为min(n-i+1, n-j+1)
时,输出如下,可以看出数值沿主对角线从大到小递减。
5 4 3 2 1
4 4 3 2 1
3 3 3 2 1
2 2 2 2 1
1 1 1 1 1
对于本题目,输出的取值为min(min(i,j), min(n-i+1, n-j+1))
,即重叠以上两个方阵,我们总取其中较小的值,输出如下。
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
C++ 代码
#include <iostream>
using namespace std;
int main()
{
int n;
while(scanf("%d", &n)==1&&n)
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
printf("%d ", min(min(i,j), min(n-i+1, n-j+1)));
}
puts("");
}
puts("");
}
return 0;
}
最简洁的解法了✌️
牛逼大佬
111
太强了 两个字 清晰!
大佬,请问第三步为啥合一块就重叠了呢?
取最小的数,舍去最大的数
#### 太强了
ORZ
Orz
Orz
之前描述不够准确,更新了一下题解~
太牛了,其他的人的都没看懂。收藏你这个真真懂了,DALAO
看懂了 太秒了hhh
这个解释太清楚了~
zbc
牛批,解释得很好
谢谢,看其他人代码没有明白原理,记录一下这样的规律~
妙啊
确实妙哈哈~