寒假每日一题平方矩阵 II(个人练习)详细题解+推导证明(第十四天)

Posted 我是管小亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寒假每日一题平方矩阵 II(个人练习)详细题解+推导证明(第十四天)相关的知识,希望对你有一定的参考价值。

文章目录

前言

明天就要过年了,心里别提有。。。有多无感了,除了能一家人在一块,毫无感觉。

今天的题目是来自语法题。

一眨眼感觉假期都要结束了,难顶

题目

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

数组的形式参照样例。

输入格式

  • 输入包含多行,每行包含一个整数N。
  • 当输入行为N=0时,表示输入结束,且该行无需作任何处理。

输出格式

  • 对于每个输入整数N,输出一个满足要求的N阶二维数组。
  • 每个数组占N行,每行包含N个用空格隔开的整数。
  • 每个数组输出完毕后,输出一个空行。

数据范围

  • 0 ≤ N ≤ 100 0≤N≤100 0N100
输入样例:
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 O ( n 2 ) O(n^2) O(n2)

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 105;

int n;

int main()

    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;

毫无疑问,这是我个人觉得最容易想到的一种写法。

如果先行再列,也不是不能写,但是可能需要一个数组来存储。

最后提交,AC😁

推导证明

直接输出的规律是从i位置,即对角线,左侧是从大到小,右侧是从小到大,需要注意的是,右侧的输出结果是 j - i + 1,不是 j 或者 j - i。

写法2 O ( n 2 ) O(n^2) O(n2)

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 105;

int n;
int a[N][N];

int main()

    while (cin >> n, n)
    
        for (int i = 1; i <= n; i ++ )
            for (int j = i, k = 1; j <= n; j ++, k ++ )
            
                a[i][j] = k;
                a[j][i] = k;
            

        for (int i = 1; i <= n; i ++ )
        
            for (int j = 1; j <= n; j ++ )
                cout << a[i][j] << ' ';
            cout << endl;
        
        cout << endl;
    

    return 0;

毫无疑问,这是最简单的方法,从左到右,从上到下,依次遍历,存储在数组中即可。

最后提交,AC😁

推导证明

需要注意 i 和 j 的大小关系,比如 a[i][j] 和 a[j][i]。

写法3 O ( n 2 ) O(n^2) O(n2)

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 105;

int n;
int main()

    while (cin >> n, n)
    
        for (int i = 1; i <= n; i ++ )
        
            for (int j = 1; j <= n; j ++ )
                cout << abs(i - j) + 1 << ' ';
            cout << endl;
        
        cout << endl;
    

    return 0;

毫无疑问,这是牛逼的方法,但是我觉得这一定不是第一时间能想到的方法。

最后提交,AC😁

推导证明

具体的思考过程如下,首先是任意选出两个点进行评估,比如(1,3)和(3,5)这两个点,相同点是什么呢,就是都是3,再就是差值的绝对值是相同的。

举一反三

类似的平方矩阵题。

总结

继续努力,坚持更新,14th打卡。

以上是关于寒假每日一题平方矩阵 II(个人练习)详细题解+推导证明(第十四天)的主要内容,如果未能解决你的问题,请参考以下文章

寒假每日一题蛇形矩阵(个人练习)详细题解+推导证明(第三天)

寒假每日一题货仓选址(个人练习)详细题解+推导证明(第一天)

寒假每日一题找硬币(个人练习)详细题解+推导证明(第十二天)

寒假每日一题剪绳子(个人练习)详细题解+推导证明(第六天)

寒假每日一题红与黑(个人练习)详细题解+推导证明(第四天)

寒假每日一题数字三角形(个人练习)详细题解+推导证明(第二天)