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

Posted 我是管小亮

tags:

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

文章目录

前言

今天坚持下来了,哈哈,真不容易啊,21计划!!!

过两天好像要全民检测,会被关在家里,正好可以看看剧,做做题,人生啊

今天还是寒假每日一题,不是软广,不是硬广,只是个人练习,题目来自微软面试题,语法题。

不过leetcode上也有类似的题,应该是叫顺时针打印矩阵。

题目

输入两个整数n和m,输出一个n行m列的矩阵,将数字 1 到 n*m 按照回字蛇形填充至矩阵中。

具体矩阵形式可参考样例。

输入格式

  • 输入共一行,包含两个整数n和m。

输出格式

  • 输出满足要求的矩阵。
  • 矩阵占n行,每行包含m个空格隔开的整数。

数据范围

  • 1 ≤ n , m ≤ 100 1≤n,m≤100 1n,m100
输入样例:
3 3

输出样例:
1 2 3
8 9 4
7 6 5

详细题解

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

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

using namespace std;

const int N = 105;

int n, m;
int f[N][N];

int main()

    cin >> n >> m;
    int dx[] = -1, 0, 1, 0, dy[] = 0, 1, 0, -1;
    int x = 0, y = 0, d = 1;
    for (int i = 1; i <= n * m; ++ i )
    
        f[x][y] = i;
        int a = x + dx[d], b = y + dy[d];
        if(a < 0 || a >= n || b < 0 || b >= m || f[a][b])
        
            d = (d + 1) % 4;
            a = x + dx[d], b = y + dy[d];
        
        x = a, y = b;
    
    
    for (int i = 0; i < n; ++ i )
    
        for(int  j = 0; j < m; ++ j )
            cout << f[i][j] << " ";
        cout << endl;
    
    
    return 0;

毫无疑问,这是一道经典问题,力扣人称螺旋矩阵。

  • 对于坐标方程,它的上下左右四个坐标,可以使用代码进行表示;
  • 对于状态方程,它的右下左上四个状态,可以使用数值进行表示;
  • 对于特殊状态,它的上下左右四个位置,可以使用坐标进行表示;

最后提交,AC😁

推导证明

本题的推导即为代码推导,按照y总的dp思考法,可以分为几个步骤。

  • 首先是上面提到的三个情况;
  • 然后是用一个坐标来存储每一个位置的数值;
  • 接着是分别用两个坐标表示上下左右四个坐标;
  • 之后是输出结果;

举一反三

可以使用LeetCode进行验证和扩展。

class Solution 
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) 
        vector<int> ans;
        if(matrix.size()==0 || matrix[0].size()==0) return ans;
        int l=0,r=matrix[0].size()-1,t=0,b=matrix.size()-1;
        while(1)
            for(int i=l;i<=r;++i) ans.push_back(matrix[t][i]);
            if(++t>b) break;
            for(int i=t;i<=b;++i) ans.push_back(matrix[i][r]);
            if(--r<l) break;
            for(int i=r;i>=l;--i) ans.push_back(matrix[b][i]);
            if(--b<t) break;
            for(int i=b;i>=t;--i) ans.push_back(matrix[i][l]);
            if(++l>r) break;
        
        return ans;
    
;

总结

继续努力,坚持更新,3rd打卡。

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

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

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

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

寒假每日一题回文平方(个人练习)详细题解+推导证明(第五天)

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

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