1284. 转化为全零矩阵的最少反转次数

Posted hunter01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1284. 转化为全零矩阵的最少反转次数相关的知识,希望对你有一定的参考价值。

https://leetcode-cn.com/problems/minimum-number-of-flips-to-convert-binary-matrix-to-zero-matrix/

DFS

class Solution {
private:
    static constexpr int dirs[5][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {0, 0}};
    int ans;

public:
    Solution(): ans(1e9) {

    }

    void convert(vector<vector<int>>& mat, int m, int n, int i, int j) {
        for (int k = 0; k < 5; ++k) {
            int i0 = i + dirs[k][0], j0 = j + dirs[k][1];
            if (i0 >= 0 && i0 < m && j0 >= 0 && j0 < n) {
                mat[i0][j0] ^= 1;
            }
        }
    }

    void dfs(vector<vector<int>>& mat, int m, int n, int pos, int flip_cnt) {
        if (pos == m * n) {
            bool flag = true;
            for (int j = 0; j < n; ++j) {
                if (mat[m - 1][j] != 0) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                ans = min(ans, flip_cnt);
            }
            return;
        }

        int x = pos / n, y = pos % n;
        if (x == 0) {
            dfs(mat, m, n, pos + 1, flip_cnt);
            convert(mat, m, n, x, y);
            dfs(mat, m, n, pos + 1, flip_cnt + 1);
            convert(mat, m, n, x, y);
        }
        else {
            if (mat[x - 1][y] == 0) {
                dfs(mat, m, n, pos + 1, flip_cnt);
            }
            else {
                convert(mat, m, n, x, y);
                dfs(mat, m, n, pos + 1, flip_cnt + 1);
                convert(mat, m, n, x, y);
            }
        }
    }

    int minFlips(vector<vector<int>>& mat) {
        int m = mat.size(), n = mat[0].size();
        dfs(mat, m, n, 0, 0);    
        return (ans != 1e9 ? ans : -1);
    }
};

以上是关于1284. 转化为全零矩阵的最少反转次数的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 5282. 转化为全零矩阵的最少反转次数 bfs 双向bfs

LeetCode 1284. Minimum Number of Flips to Convert Binary Matrix to Zero Matrix (最少翻转次数将二进制矩阵全部置为0)(示

[M贪心] lc1888. 使二进制字符串字符交替的最少反转次数(贪心+前后缀分解+周赛244_3)

1888. 使二进制字符串字符交替的最少反转次数

彩色图像转变为灰度图像的matlab的程序代码是啥?

OpenCV矩阵元素除法给出全零结果