螺旋矩阵,蛇形矩阵(偏移量C++)

一、螺旋矩阵(LeetCode 59)

二、蛇形矩阵(ACM)


通过偏移量解决以上问题 思路都是一样的


一、螺旋矩阵(LeetCode 59)

https://leetcode.cn/problems/spiral-matrix/

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素

 思路:用偏移量,不断更新元素坐标位置并读取,遇到边界旋转。

代码如下:

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int>nums;
int x=0,y=0;
int a=0,b=0;
int n=matrix.size();
int m=matrix[0].size();
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int d=0;
for(int i=1;i<=n*m;i++ )
{
nums.push_back(matrix[x][y]); //读取该位置的元素 并放入nums数组;
matrix[x][y]=0;     //读取过后的元素 都赋值为0 遇到0转弯 不读取 也可赋值成其它的元素;
a=x+dx[d];b=y+dy[d];  //预测下次移动的位置;开始时d=0(dx[0]=0,dy[0]=1),先不断右移
if(a<0||b<0||a>=n||b>=m||matrix[a][b]==0) //判断下次的移动是否越界 或 已经读取过;
{
    d=(d+1)%4;  //作顺时针旋转      下,左,上,右;
    a=x+dx[d],b=y+dy[d]; //若越界  进入if 旋转 再次预测下次的位置;
}
x=a;y=b;//更新坐标;
}
return nums;
    }
};

二、蛇形矩阵(ACM)

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

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

输入格式

输入共一行,包含两个整数 nn 和 mm。

输出格式

输出满足要求的矩阵。

矩阵占 nn 行,每行包含 mm 个空格隔开的整数。

数据范围

1≤n,m≤1001≤n,m≤100

输入样例:

3 3

输出样例:

1 2 3
8 9 4
7 6 5
#include <iostream>

using namespace std;

int q[1000][1000]; //int数组需要定义在main外,若用vector容器 可以在main函数中定义vector<int>(1000).
int main()
{
   
    int n, m;
   
    int a, b;
    cin >> n >> m;
   
    int d = 1;
    int x = 0, y = 0;
    int dx[] = { -1,0,1,0 }, dy[] = { 0,1,0,-1 };
    for (int i = 1; i <= n * m; i++)
    {
        q[x][y] = i;
        a = x + dx[d], b = y + dy[d];
        if (a < 0 || b < 0 || q[a][b] || a >= n || b >= m)
        {
            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 << q[i][j] << ' ';
        cout << endl;
    }

    return 0;
}

三、螺旋矩阵||


猜你喜欢

转载自blog.csdn.net/qq_68004012/article/details/126102202