算法:采用偏移值来简化判断矩阵各方向的条件

529 阅读1分钟

该题的关键,就是可以新建各个方向上的偏移值,来减少重复的判断条件,减少代码量和出错率。

题目1 :蛇形矩阵

改题蛇沿着右->下->左->上的条件进行走,如走到边界处或者要走的方向已经走过,则改变走的方向。

#include <bits/stdc++.h>

using namespace std;
// 右下左上
int matrix[9][9], director[][2] = {{0,  1}, {1,  0}, {0,  -1}, {-1, 0}};

int main() {
    int n;
    cin >> n;

    int x = 0, y = 0, cur = 0;
    for (int i = 0, len = n * n; i < len; ++i) {
        matrix[x][y] = i + 1;
        int dx = x + director[cur][0], dy = y + director[cur][1];
        if (dx >= n || dx < 0 ||
            dy >= n || dy < 0 ||
            matrix[dx][dy] > 0) {
            cur = (cur + 1) % 4;
        }
        x += director[cur][0];
        y += director[cur][1];
    }

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            printf("%3d", matrix[i][j]);
        }
        cout << endl;
    }
    return 0;
}

题目2:螺旋矩阵

此题按照右->下->左->上的条件遍历即可,每遍历过一个位置将遍历过的位置设标记为 -105(数据范围为-100 <= matrix[i][j] <= 100),或者新开辟一个数组记录每次遍历过的位置也可。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>> &matrix) {
        vector<int> ans;
        int row = matrix.size(), col = matrix[0].size();
        int x = 0, y = 0, cur = 0;
        int dir[][2] = {{0,  1}, {1,  0}, {0,  -1}, {-1, 0}};

        for (int i = 0, len = row * col; i < len; ++i) {
            ans.push_back(matrix[x][y]);
            matrix[x][y] = -105;
            int dx = x + dir[cur][0], dy = y + dir[cur][1];
            if (dx >= row || dx < 0 ||
                dy >= col || dy < 0 ||
                matrix[dx][dy] == -105) {
                cur = (cur + 1) % 4;
            }
            x += dir[cur][0];
            y += dir[cur][1];
        }
        return ans;
    }
};