一、原题题目
二、解题思路
看样例,每输入一个 n ,就会有 n x n 大小的二维数组,最外一圈是1,第二圈是2,依次类推。从中,我们不难看出,这些方阵数组都是对称的,并且可以从中找出数和位置的坐标的关系:
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
a[i][j] = min(min(i, j), min(n-i+1, n-j+1));
这要怎么解释呢?借鉴A+B的题解,我们以5阶为例,来探究此方阵数组的对称性:
三、代码实现
#include <stdio.h>
#define N 110
//自定义函数用来选择两个数中较小的数
int min(int a, int b)
{
if (a < b)
return a;
else
return b;
}
int main()
{
int n, a[N][N];
while (scanf("%d", &n) && n != 0){ //多组输入
//判断当前数值 内层第一个min是判断正方形左上部分,第二个min判断正方形右下部分
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
a[i][j] = min(min(i, j), min(n-i+1, n-j+1));
//输出平行矩阵
for (int i = 1; i <= n; i ++){
for (int j = 1; j <= n; j ++)
printf("%d ", a[i][j]);
printf("\n");
}
printf("\n");
}
return 0;
}
三、题目总结
其实这个方法还是很简单的,只要找到数与坐标相对应的规律即可,另外还有其他方法,具体请点击这里进行跳转:小张同学的AcWing题解