目录

每日一题--二维数组

目录

【题目描述】

输入一个正整数 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;
}