[AcWing 756] 蛇形矩阵

image


点击查看代码
#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 ++ ,执行下一条规则。

posted @ 2022-04-13 20:28  wKingYu  阅读(26)  评论(0编辑  收藏  举报