1. 题目

给你一个 m x n 的二进制矩阵 mat。

每一步,你可以选择一个单元格并将它反转(反转表示 0 变 1 ,1 变 0 )。如果存在和它相邻的单元格,那么这些相邻的单元格也会被反转。(注:相邻的两个单元格共享同一条边。)

请你返回将矩阵 mat 转化为全零矩阵最少反转次数,如果无法转化为全零矩阵,请返回 -1 。

二进制矩阵的每一个格子要么是 0 要么是 1 。

全零矩阵是所有格子都为 0 的矩阵。

示例 1:
输入:mat = [[0,0],[0,1]]
输出:3
解释:一个可能的解是反转 (1, 0),然后 (0, 1) ,最后是 (1, 1) 。示例 2:
输入:mat = [[0]]
输出:0
解释:给出的矩阵是全零矩阵,所以你不需要改变它。示例 3:
输入:mat = [[1,1,1],[1,0,1],[0,0,0]]
输出:6示例 4:
输入:mat = [[1,0,0],[1,0,0]]
输出:-1
解释:该矩阵无法转变成全零矩阵提示:
m == mat.length
n == mat[0].length
1 <= m <= 3
1 <= n <= 3
mat[i][j] 是 0 或 1 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-number-of-flips-to-convert-binary-matrix-to-zero-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. BFS解题

  • 矩阵每个格子反转操作后都可以转换成数字,检查它是否等于0(状态)
  • 先将初始状态push进队列,visited访问记录该状态(编码成数字)
  • 然后依次更改矩阵的每个位置,如果更改后的状态没出现过,push进队列
  • 遇见状态0的时候,停止BFS,返回BFS的层数,即最少反转次数
class Solution {vector<vector<int>> dir ={{1,0},{0,1},{0,-1},{-1,0},{0,0}};//反转操作位置int m, n;
public:int minFlips(vector<vector<int>>& mat) {m = mat.size(), n = mat[0].size();int num = matToNum(mat), step = 0, size, i, j;if(num == 0)return step;unordered_set<int> visited;//访问过了的状态queue<int> q;visited.insert(num);q.push(num);while(!q.empty()){++step;//bfs步数size = q.size();while(size--){numToMat(q.front(),mat);//将数字解码成矩阵matq.pop();for(i = 0; i < m; i++)//mat的每个位置都可以操作{for(j = 0; j < n; j++){   //每个位置进行反转操作flip(mat,i,j);num = matToNum(mat);//将矩阵状态编码成numif(num == 0)return step;if(!visited.count(num))//这种状态没有访问过{visited.insert(num);//访问标记q.push(num);//加入队列}flip(mat,i,j);//恢复现场,进行下个位置反转}}}}return -1;}int matToNum(vector<vector<int>>& M){   //矩阵编码成数字int num = 0, i, j;for(i = 0; i < m; i++)for(j = 0; j < n; j++)num = num*2+M[i][j];return num;}void numToMat(int num, vector<vector<int>>& M){   //数字解码成矩阵int bit, i, j;for(i = m-1; i >= 0; i--)for(j = n-1; j >= 0; j--){M[i][j] = (num&1);//取最低位num >>= 1;//数字右移1位}}void flip(vector<vector<int>>& M, int i, int j){   //反转i,j位置,及其周围4个位置int x, y, k;for(k = 0; k < 5; k++){x = i+dir[k][0];y = j+dir[k][1];if(x>=0 && x<m && y>=0 && y<n)M[x][y] = 1-M[x][y];}}
};

LeetCode 1284. 转化为全零矩阵的最少反转次数(BFS 矩阵状态编码解码)相关推荐

  1. LeetCode——1888. 使二进制字符串字符交替的最少反转次数(Minimum Number of Flips to Make the Binary ...)[中等]——分析及代码(Java)

    LeetCode--1888. 使二进制字符串字符交替的最少反转次数[Minimum Number of Flips to Make the Binary String Alternating][中等 ...

  2. LeetCode 871. Minimum Number of Refueling Stops 最少加油次数

    LeetCode 871. Minimum Number of Refueling Stops 本题是LeetCode 871题,最少加油次数. 题目描述 A car travels from a s ...

  3. LeetCode 1536. 排布二进制网格的最少交换次数

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 n x n 的二进制网格 grid,每一次操作中,你可以选择网格的 相邻两行 进行交换. 一个符合要求的网格需要满足主对角线以上的格子全部都是 ...

  4. LeetCode 2208. 将数组和减半的最少操作次数(优先队列)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个正整数数组 nums .每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半.(注意,在后续操作中你可以对减半过的数继续 ...

  5. LeetCode 1553. 吃掉 N 个橘子的最少天数(BFS)

    文章目录 1. 题目 2. 解题 1. 题目 厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子. 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子. ...

  6. LeetCode 773. 滑动谜题(BFS 地图状态转换的最短距离)

    1. 题目 在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示. 一次移动定义为选择 0 与一个相邻的数字(上下左右)进行交换. 最终当板 b ...

  7. LeetCode 1713. 得到子序列的最少操作次数(最长上升子序DP nlogn)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素. 每一次操作中,你可以在 arr 的任 ...

  8. LeetCode简单题之使每位学生都有座位的最少移动次数

    题目 一个房间里有 n 个座位和 n 名学生,房间用一个数轴表示.给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置.同时给你一个长度为 n 的数组 studen ...

  9. LeetCode 2139. 得到目标值的最少行动次数(贪心)

    文章目录 1. 题目 2. 解题 1. 题目 你正在玩一个整数游戏.从整数 1 开始,期望得到整数 target . 在一次行动中,你可以做下述两种操作之一: 递增,将当前整数的值加 1(即, x = ...

最新文章

  1. make--变量与函数的综合示例 自动生成依赖关系
  2. asp.net实现下载
  3. layui鼠标放上图片局部放大_花卉图片后期这5招,不美都不行!
  4. Gentoo 安装日记 03 (配置网络)
  5. 本周进步要点20161009
  6. python建立pip.ini
  7. 【JQuery】on/off 绑定事件和解绑事件
  8. vaadin_Vaadin Flow –奇妙的鹿
  9. 图像分割-二阶导数零交叉点的含义
  10. 【摘录】MTK按键扫描原理及相关代码
  11. 【C++深度剖析教程25】继承中的构造与析构
  12. 博客系统如何随机插入大量文章数据
  13. 简单的个人介绍网页【附代码】
  14. MyBatis超详细笔记
  15. python如何爬取百度云_python如何爬取百度云连接方法指导
  16. 该网站服务器出错了怎么回事,该网站服务器出错了是什么意思(图文)
  17. 用python或者vba把一个excel表格拆分成多个excel表格
  18. win10关闭windows聚焦_Windows 10聚焦怎么用?教你玩转Windows聚焦功能
  19. 我和 JSRUN 网站的一些故事
  20. window下php自动脚本,Windows下使用VBS实现定时执行访问URL脚本(刷流量)

热门文章

  1. C++静态成员函数指针
  2. setup2go制作安装程序
  3. iOS关于armv7,armv7s,arm64,i386,x86_64等问题
  4. c语言枚举法礼泡声次数,C语言枚举类型举例
  5. java启动密码,java - 用户验证密码后如何启动java applet程序? - SO中文参考 - www.soinside.com...
  6. 自动部署war包脚本
  7. 洛谷树剖模板题 P3384 | 树链剖分
  8. POJ 3041 Asteroids (对偶性,二分图匹配)
  9. ACM PKU 2559 Largest Rectangle in a Histogram http://acm.pku.edu.cn/JudgeOnline/problem?id=2559
  10. 详细记录丨Realtek RTL8188FU WiFi 驱动移植