输入整数 $N$,输出一个 $N$ 阶的回字形二维数组。
数组的最外层为 $1$,次外层为 $2$,以此类推。
输入格式
输入包含多行,每行包含一个整数 $N$。
当输入行为 $N=0$ 时,表示输入结束,且该行无需作任何处理。
输出格式
对于每个输入整数 $N$,输出一个满足要求的 $N$ 阶二维数组。
每个数组占 $N$ 行,每行包含 $N$ 个用空格隔开的整数。
每个数组输出完毕后,输出一个空行。
输入样例
1
2
3
4
5
0
输出样例
1
1 1
1 1
1 1 1
1 2 1
1 1 1
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 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
方法
方阵对称性
用对称性解释如何对输出取值。
以5阶为例,从
1
开始i
,j
为两层循环
的索引,这里取值为min(i,j)
时,输出如下,可以看出沿主对角线
的对称特点。
#include <iostream>
#include <algorithm>//min函数
using namespace std;
int main()
{
int n;
while (cin>>n,n)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
int up = i, down = j;
cout<<min(up,down)<<' ';
}
cout<<endl;
}
cout<<endl;
}
return 0;
}
输出结果
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(left, right)
时,输出如下,可以看出沿副对角线
的对称特点。
#include <iostream>
#include <algorithm>//min函数
using namespace std;
int main()
{
int n;
while (cin>>n,n)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
int left = n-i+1, right = n-j+1;
cout<<min(left,right)<<' ';
}
cout<<endl;
}
cout<<endl;
}
return 0;
}
输出结果
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(Up,Down),min(Left,Right))
,即重叠以上两个方阵,我们总取其中较小的值
,输出如下。
#include <iostream>
#include <algorithm>//min函数
using namespace std;
int main()
{
int n;
while (cin>>n,n)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
int up = i, down = j,left = n-i+1, right = n-j+1;
cout<<min(min(up,down),min(left,right))<<' ';
}
cout<<endl;
}
cout<<endl;
}
return 0;
}
输出结果
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
-
解释一下
min(min(Up ,Down), min(Left, Right))
给定一个(i,j)
规律是每个数等于它到上
下
左
右
四条边的距离的最小值
。
Up:i
Down:n-i+1
Left:j
-
Right:n-j+1
-
对于5阶
(1,1) (1,2) (1,3) (1,4) (1,5) (2,1) (2,2) (2,3) (2,4) (2,5) (3,1) (3,2) (3,3) (3,4) (3,5) (4,1) (4,2) (4,3) (4,4) (4,5) (5,1) (5,2) (5,3) (5,4) (5,5) -
则
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 -
对于4阶
(1,1) (1,2) (1,3) (1,4) (2,1) (2,2) (2,3) (2,4) (3,1) (3,2) (3,3) (3,4) (4,1) (4,2) (4,3) (4,4) -
则
1 1 1 1 1 2 2 1 1 2 2 1 1 1 1 1