每日一题--二维数组
目录
【题目描述】
输入一个正整数 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;
}