AcWing 寒假每日一题 2021-01-11 蛇形矩阵

AcWing 756. 蛇形矩阵
在这里插入图片描述
思路分析:
没啥思路QWQ(思路写在代码的注释里了)一个模拟题罢了,不过是有学到新东西的~
在这里插入图片描述

在这里插入图片描述

AC代码:

#include <bits/stdc++.h>

#define ll long long
using namespace std;
const int N = 110;

int q[N][N];

int main() {
    
    
    int n, m;
    while (~scanf("%d%d", &n, &m)) {
    
    
        int dx[] = {
    
    -1, 0, 1, 0}, dy[] = {
    
    0, 1, 0, -1};
        memset(q, 0, sizeof(q));
        // 定义偏移量数组
        int x = 0, y = 0, d = 1;
        // 定义初始坐标及方向
        for (int i = 1; i <= n * m; i++) {
    
    
            q[x][y] = i;
            int a = x + dx[d], b = y + dy[d];
            // 下一步的坐标
            if (a < 0 || a >= n || b < 0 || b >= m || q[a][b] != 0) {
    
    
                // 撞墙情况有两种
                // 一种是,撞到边界:a == -1 || a == n || b == -1 || b == m
                // 一种是,撞到已经填过数字的地方 q[a][b] != 0
                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++) {
    
    
                if (j == m - 1)
                    printf("%d\n", q[i][j]);
                else
                    printf("%d ", q[i][j]);
            }
    }
    return 0;
}

学到的东西:

  1. 向量坐标分析法: 适用题目—>任何网格类题目,利用向量(坐标)来表示偏移量,写出需要的偏移量数组即可,避免了写大量的if语句,可以优化网格类题目的代码,诸如象棋题之类的。
  2. memset初始化二维数组: 不从底层看的话,正常定义int array[m][n];初始化的方式依然是:memset(array,0,sizeof(array));如果非要从底层来解释这个东西,貌似memset只能初始化内存空间是连续的二维数组。这个东西以后学的多了,肯定是要进行区分的,目前来讲只知道我写的这一点应该就阔以了QWQ

猜你喜欢

转载自blog.csdn.net/qq_45654671/article/details/112497369
今日推荐