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