[AcWing 756] 蛇形矩阵
点击查看代码
#include<iostream>
using namespace std;
const int N = 110;
int n, m;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
int x = 0, y = 0, d = 1, q[N][N];
int main()
{
cin >> n >> m;
for (int i = 1; i <= m * n; 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]) {
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;
}
此题可以代表一类题,这类题具有一个特点,在进行矩阵变换时具有一定的规则,这时可以使用偏移量数组记录偏移量,在进行变换时就取出来偏移量数组中的值进行变换。
此题的思路:
(1)使用 dx[ ] 记录 x 方向上的偏移量,初始化时 { -1,0,1,0 } 分别代表向上移动,x 方向不移动, 向下移动,x 方向不移动,使用 dy[ ] 记录 y 方向上的偏移量,初始化时 { 0,1,0,-1 } 分别代表 y 方向不移动,向右移动,y 方向不移动,向左移动。
(2)初始化时 d = 1,表示一开始进行的是向右移动,在进行变换时,使用 a 和 b 记录使用 x[d] 和 y[d] 后矩阵元素此时的位置,如果超过矩阵的边界或者这个位置已经有值,就把 d ++ ,执行下一条规则。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!