# 每日一题--二维数组

> 发布于：2020-10-06 | 分类：刷题 | 原文：https://www.imbailey.cn/post/daily-2d-array-concentric-matrix

【题目描述】

输入一个正整数 n，输出 n×n 的回型方阵。例如，n=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

【输入格式】

一行，包含一个正整数 n，2≤n≤9。

【输出格式】

共 n 行，每行包含 n 个正整数，之间用一个空格隔开。

## 答案1

先给左上角负值，再通过下标的对称性复制到左下角，右上角，右下角

```
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int n,i,j,a[10][10];

    cin >> n;

    for(i=1;i<=(n+1)/2;i++)             //只写入整个数组的四分之一，多出四分之一的部分无所谓
    {
      for(j=1;j<=(n+1)/2;j++)               //i控制行数，j控制列数
      {
          a[i][j] = min(i,j);               //min函数引用了algorithm库,i和j中较小的那个值恰好是需要写入的值
          a[i][n+1-j] = a[n+1-i][j] = a[n+1-i][n+1-j] = a[i][j];            //左右对称，上线对称，对角线对称
      }
    }

    for(i=1;i<=n;i++)                   //输出部分
    {
        for(j=1;j<=n-1;j++)
        {
            cout << a[i][j] << " ";
        }
        cout << a[i][n] << endl;        //最后一个输出单独写，因为空格
    }
    return 0;
}
```

## 答案2

通过“一圈一圈”赋值的方法做，先给a\[1\]\[1\]到a\[n\]\[n\]全部赋值1，然后给a\[2\]\[2\]到a\[n-1\]\[n-1\]全部赋值2，......共n/2圈（如果n是奇数，则最后一圈就是一个数）

```
#include <iostream>

using namespace std;

int main()
{
    int n,i,j,k,a[10][10];
    cin >> n;

    for(k=1;k<=(n+1)/2;k++)         //输入部分，看不懂就另n=5,k=1,k=2,i=1,i=1,j=1,j=2演算一遍
    {
        for(i=k;i<=n+1-k;i++)
        {
            for(j=k;j<=n+1-k;j++)
            {
                a[i][j] = k;
            }
        }
    }

    for(i=1;i<=n;i++)                   //输出部分
    {
        for(j=1;j<=n-1;j++)
        {
            cout << a[i][j] << " ";
        }
        cout << a[i][n] << endl;
    }
    return 0;
}
```
