题目:平方矩阵二
描述
输入整数 N,输出一个 N 阶的二维数组。
数组的形式参照样例。
输入格式
输入包含多行,每行包含一个整数 N。
当输入行为 N=0 时,表示输入结束,且该行无需作任何处理。
输出格式
对于每个输入整数 N,输出一个满足要求的 N 阶二维数组。
每个数组占 N 行,每行包含 N 个用空格隔开的整数。
每个数组输出完毕后,输出一个空行。
数据范围
0≤N≤100
输入样例:
1
2
3
4
0
输出样例:
1
1 2
2 1
1 2 3
2 1 2
3 2 1
1 2 3 4
2 1 2 3
3 2 1 2
4 3 2 1
解:
该题为找规律类的题
解法一
每行每行的找规律,不难发现每行都分为两部分,以对角线为分界点,对角线前的从大到小递减,对角线往后的从小到大递增
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n;
while(cin >> n, n)
{
for (int i = 1; i <= n; i ++ )
{
for (int j = i; j >= 1; j -- ) //对角线前的数(包括对角线)
cout << j << ' ';
for (int j = i + 1; j <= n; j ++ ) //对角线后的数
cout << j - i + 1 << ' ';
cout << endl;
}
cout << endl;
}
return 0;
}
解法二
通过观察能看出每第i行和第i列的数字重合且规律单一,符合规律如下
对角线上的数字为1 即q[i][i] = 1,且该数往右和往下的数依次加1
#include <iostream>
#include <cstdio>
using namespace std;
int q[100][100];
int main()
{
int n;
while(cin >> n, n)
{
for(int i = 0; i < n; i ++)
{
q[i][i] = 1;
for(int j = i + 1, k = 2; j < n; j ++, k ++)
q[i][j] = k;
for(int j = i + 1, k = 2; j < n; j ++, k ++)
q[j][i] = k;
}
for(int i = 0; i < n; i ++ )
{
for (int j = 0; j < n; j ++ )
cout << q[i][j] << ' ';
cout << endl;
}
cout << endl;
}
return 0;
}
解法三
i代表行,j代表列,每个数都满足p[i][j] = |i - j| + 1
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int n;
while(cin >> n, n)
{
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < n; j ++ )
cout << abs(i - j) + 1 << ' ';
cout << endl;
}
cout << endl;
}
return 0;
}