蛇形矩阵
主要考点: 偏移量技巧
上右下左:
dx[] = {-1,0,1,0};
dy[] = {0,1,0,-1};
direction:
上0右1下2左3
d = (d+1)%4;
撞墙后 d会改变方向,每次撞墙 d 顺时针转90°
(x,y)沿着d这个方向走,相当于 (x, y) + (dx[d], dx[d]) = (x, y
);
注意
撞墙:(a = x + dx[d] , b = y + dy[d])
1. 出界 (a < 0 || a >= n || b < 0 || b >= m)
2. 重复格子 (q[a][b] == 1)
C++ 代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 110;
int n, m;
int q[N][N];
int main() {
cin >> n >> m;
int dx[] = {-1, 0, 1, 0}; // 偏移量数组
int dy[] = {0, 1, 0, -1};
int x = 0, y = 0, d = 1; // x y 当前位置坐标, d 代表要走的方向,开始从左往右 为1
for (int i = 1; i <= n * m; i++) { // 遍历所有n*m 矩阵的数
q[x][y] = i;
int a = x + dx[d], b = y + dy[d]; // a b 代表从当前点沿着d方向走到下一个格子的是谁
if (a < 0 || a >= n || b < 0 || b >= m || q[a][b]) { // 判断是否撞墙
d = (d + 1) % 4; // 如果撞墙,则顺时针旋转方向
a = x + dx[d], b = y + dy[d]; // 更新坐标后,就不会撞墙
}
x = a, y = b; // 循环前更新 x y 为当前位置坐标
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
cout << q[i][j] << ' '; // scanf("%7d\n", q[i][j]);
cout << endl;
}
return 0;
}