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);
    }
};

原文地址:https://www.cnblogs.com/Hunter01/p/12623349.html

时间: 2024-08-30 10:38:25

1284. 转化为全零矩阵的最少反转次数的相关文章

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

地址 https://leetcode-cn.com/submissions/detail/39277402/ 题目描述给你一个 m x n 的二进制矩阵 mat. 每一步,你可以选择一个单元格并将它反转(反转表示 0 变 1 ,1 变 0 ).如果存在和它相邻的单元格,那么这些相邻的单元格也会被反转.(注:相邻的两个单元格共享同一条边.) 请你返回将矩阵 mat 转化为全零矩阵的最少反转次数,如果无法转化为全零矩阵,请返回 -1 . 二进制矩阵的每一个格子要么是 0 要么是 1 . 全零矩阵是

1、对一个正整数算到1需要的最少操作次数

题1:实现一个函数,对一个正整数n,算得到1需要的最少操作次数.操作规则为:如果n为偶数,将其除以2:如果n为奇数,可以加1或减1:一直处理下去:例子:func(7) = 4,可以证明最少需要4次运算n = 7n-1 6n/2 3n-1 2n/2 1 要求:实现函数(实现尽可能高效) int func(unsign int n):n为输入,返回最小的运算次数.给出思路(文字描述),完成代码,并分析你算法的时间复杂度. java源程序: package bfgy.lab.work; import 

数据结构实验3(飞机最少环城次数问题)

使用图算法解决应用问题: 设有n个城市, 编号为0 ~ n - 1, m条航线的起点和终点由用户输入提供. 寻找一条换乘次数最少的线路方案. 使用有向图表示城市间的航线, 只要两城市之间有航班, 则图中这两点间存在一条权为1的边. 用Dijkstra算法实现求最少换乘次数. 在MGraph类中增加Choose函数以及Dijkstra函数即可. 实现代码: #include "iostream" #include "cstdio" #include "cst

最少乘法次数

最少乘法次数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2=22(第一次乘),22*22=24(第二次乘),所以最少共2次: 输入 第一行m表示有m(1<=m<=100)组测试数据: 每一组测试数据有一整数n(0<n<=10000); 输出 输出每组测试数据所需次数s; 样例输入 3234 样例输出 122 最少乘法次数

最少的次数

2191: 最少的次数 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 553  Solved: 73[Submit][Status][BBS] Description 这一天,成都东软学院ACM团队举办了一场游戏.游戏是这样的: 在桌上有一堆糖,其中有一颗糖与其他糖外观一模一样,但重量却明显轻.现在得知桌上共有N颗糖,还有一个天平,问最少需要多少次一定能准确的找出该糖?今天作为比赛中的你,相信这一问题应该不是什么难事,加油吧! Input 第一行包

最少乘法次数 NYOJ 46

1 #include<stdio.h>//最少乘法次数(46) 2 int main() 3 { 4 int i,x,m; 5 scanf("%d",&x); 6 while(x--){ 7 scanf("%d",&m); 8 i=0; 9 while(m!=1){ 10 if(m%2==1){ 11 i+=2; 12 } 13 else i+=1; 14 m/=2; 15 } 16 printf("%d\n",i);

广度优先搜索-最少转机次数

当你和家人一起去海南旅游,可是你的城市并没有直接到达海南的飞机,但是你已经搜集了很多航班的信息,现在你希望找到一种乘坐方式,使得转机次数最少 如何解决呢? 假如你的城市在1号城市,海南在5号城市:现有如下关系: 如何求得1号城市到5号城市的最少转机次数呢?此时就用到了本次讲解的内容,广度优先搜索! 作图的问题首先我们应该用邻接矩阵或者二维数组来存取顶点之间的关系. 广度优先搜索需要用队列来存储每次扩展的关系. 首先将1号城市入队,通过1号城市我们可以扩展出2号和3号城市,2号城市又可以扩展出3号

正整数n,算得到1需要的最少操作次数

实现一个函数,对一个正整数n,算得到1需要的最少操作次数:如果n为偶数,将其除以2:如果n为奇数,可以加1或减1:一直处理下去.例子:ret=func(7);ret=4,可以证明最少需要4次运算n=7n--6n/2 3n/2 2n++1要求:实现函数(实现尽可能高效)int func(unsign int n):n为输入,返回最小的运算次数.给出思路(文字描述),完成代码,并分析你算法的时间复杂度.请列举测试方法和思路. -------------------------------------

NYIST 46 最少乘法次数

最少乘法次数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2=22(第一次乘),22*22=24(第二次乘),所以最少共2次: 输入 第一行m表示有m(1<=m<=100)组测试数据:每一组测试数据有一整数n(0<n<=10000); 输出 输出每组测试数据所需次数s; 样例输入 3 2 3 4 样例输出 1 2 2 上传者 李剑锋 解题:快速幂.