[leetcode 剑指 Offer 29. 顺时针打印矩阵] 方向保持的DFS

[leetcode 剑指 Offer 29. 顺时针打印矩阵] 方向保持的DFS_第1张图片

// 问题和普通的DFS的区别在于,要求DFS的顺序在一定程度上保持有序,所以不能在传统的DFS内部,去遍历所有可能的方向,必须在DFS的
// 各层之间传递一个方向flag(k)用来告知现在的顺序,然后在出现非法位置的时候,去更新方向flag,并且这种DFS可能会导致死循环,
// 必须要给一个明确的退出条件(已经遍历过的位置的数量)

class Solution {
public:
    const static int Max = 110;
    int vis[Max][Max];

    vector<int> ans;
    void dfs(vector<vector<int>>& matrix ,int x, int y, int dir[4][2], int k, int num) {
        // 明确的出口条件
        if(num == matrix.size() * matrix[0].size()) {
            return ;
        }
        
        ans.push_back(matrix[x][y]);
        vis[x][y] = 1;

        int new_x = x + dir[k][0];
        int new_y = y + dir[k][1];

        if(new_x >= 0 && new_x < matrix.size() && new_y >= 0 && new_y < matrix[0].size() && vis[new_x][new_y] == 0) {
            dfs(matrix, new_x, new_y, dir, k, num + 1);
        }
        else {
            // 更新方向flag
            k = (k + 1) % 4;
            int new_x = x + dir[k][0];
            int new_y = y + dir[k][1];

            dfs(matrix, new_x, new_y, dir, k, num + 1);
        }
        
    }

    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int dir[][2] = {
            {0, 1},
            {1, 0},
            {0, -1},
            {-1, 0}
        };

        if(matrix.size() != 0)
            dfs(matrix, 0, 0, dir, 0, 0);
        return ans;
    }
};

你可能感兴趣的:(力扣,深度优先,leetcode,矩阵)