【寒假每日一题】平方矩阵 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打卡。
在这里插入图片描述

我是管小亮 CSDN认证博客专家 TensorFlow PyTorch 图像处理
纸上得来终觉浅,绝知此事要躬行

包括但不局限于机器学习,深度学习,自然语言处理,计算机视觉,知识图谱,还有Python,C++,TensorFlow,Pytorch,Keras,PaddlePaddle等,不定时分享资源(电子书/项目/工具),学习路线,思考,面经等!!!
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页