平方矩阵 II

输入整数N,输出一个N阶的二维数组。

数组的形式参照样例。

输入格式

输入包含多行,每行包含一个整数N。

当输入行为N=0时,表示输入结束,且该行无需作任何处理。

输出格式

对于每个输入整数N,输出一个满足要求的N阶二维数组。

每个数组占N行,每行包含N个用空格隔开的整数。

每个数组输出完毕后,输出一个空行。

数据范围

0N1000≤N≤100

输入样例:

1
2
3
4
5
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

1 2 3 4 5
2 1 2 3 4
3 2 1 2 3
4 3 2 1 2
5 4 3 2 1

平方矩阵这题与循环日程表有相似之处,但采用的算法是完全不同的,平方矩阵采用的是通过解决若干个子问题来达到解决整个问题的目的,是典型的分治思想。但平方矩阵相比于循环日程表稍微简单一些,只需要利用矩阵对称的性质就可以做了,并不需要分治。
思路:1.将上三角和下三角分开看,分别为两个位置a[i][j]和a[j][i]赋相同的值;
    2.注意:当i==j时,a[i][j]==1;

AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 120;
int a[N][N];

int main()
{
    ios::sync_with_stdio(false);
    int n;
    while(cin>>n&&n){
    
        int k = 1;
        for(int i = 0;i<n;++i){
            for(int j = i;j<=n;++j){
                if(i!=j) a[i][j] = a[j][i] = k;
                else a[i][j] = k;
                k++;
            }
            k = 1; //每一行做完之后将k重新赋为0,根据题目可以看出来
        }
        
        for(int i = 0;i<n;++i){
            for(int j = 0;j<n;++j){
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }    
        cout<<endl;
    }
    return 0;
}
 
原文地址:https://www.cnblogs.com/ssfannnnn/p/14307702.html