LeetCode 1284. 转化为全零矩阵的最少反转次数(BFS 矩阵状态编码解码)
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 矩阵状态编码解码)相关推荐
- LeetCode——1888. 使二进制字符串字符交替的最少反转次数(Minimum Number of Flips to Make the Binary ...)[中等]——分析及代码(Java)
LeetCode--1888. 使二进制字符串字符交替的最少反转次数[Minimum Number of Flips to Make the Binary String Alternating][中等 ...
- LeetCode 871. Minimum Number of Refueling Stops 最少加油次数
LeetCode 871. Minimum Number of Refueling Stops 本题是LeetCode 871题,最少加油次数. 题目描述 A car travels from a s ...
- LeetCode 1536. 排布二进制网格的最少交换次数
文章目录 1. 题目 2. 解题 1. 题目 给你一个 n x n 的二进制网格 grid,每一次操作中,你可以选择网格的 相邻两行 进行交换. 一个符合要求的网格需要满足主对角线以上的格子全部都是 ...
- LeetCode 2208. 将数组和减半的最少操作次数(优先队列)
文章目录 1. 题目 2. 解题 1. 题目 给你一个正整数数组 nums .每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半.(注意,在后续操作中你可以对减半过的数继续 ...
- LeetCode 1553. 吃掉 N 个橘子的最少天数(BFS)
文章目录 1. 题目 2. 解题 1. 题目 厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子. 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子. ...
- LeetCode 773. 滑动谜题(BFS 地图状态转换的最短距离)
1. 题目 在一个 2 x 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示. 一次移动定义为选择 0 与一个相邻的数字(上下左右)进行交换. 最终当板 b ...
- LeetCode 1713. 得到子序列的最少操作次数(最长上升子序DP nlogn)
文章目录 1. 题目 2. 解题 1. 题目 给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素. 每一次操作中,你可以在 arr 的任 ...
- LeetCode简单题之使每位学生都有座位的最少移动次数
题目 一个房间里有 n 个座位和 n 名学生,房间用一个数轴表示.给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置.同时给你一个长度为 n 的数组 studen ...
- LeetCode 2139. 得到目标值的最少行动次数(贪心)
文章目录 1. 题目 2. 解题 1. 题目 你正在玩一个整数游戏.从整数 1 开始,期望得到整数 target . 在一次行动中,你可以做下述两种操作之一: 递增,将当前整数的值加 1(即, x = ...
最新文章
- make--变量与函数的综合示例 自动生成依赖关系
- asp.net实现下载
- layui鼠标放上图片局部放大_花卉图片后期这5招,不美都不行!
- Gentoo 安装日记 03 (配置网络)
- 本周进步要点20161009
- python建立pip.ini
- 【JQuery】on/off 绑定事件和解绑事件
- vaadin_Vaadin Flow –奇妙的鹿
- 图像分割-二阶导数零交叉点的含义
- 【摘录】MTK按键扫描原理及相关代码
- 【C++深度剖析教程25】继承中的构造与析构
- 博客系统如何随机插入大量文章数据
- 简单的个人介绍网页【附代码】
- MyBatis超详细笔记
- python如何爬取百度云_python如何爬取百度云连接方法指导
- 该网站服务器出错了怎么回事,该网站服务器出错了是什么意思(图文)
- 用python或者vba把一个excel表格拆分成多个excel表格
- win10关闭windows聚焦_Windows 10聚焦怎么用?教你玩转Windows聚焦功能
- 我和 JSRUN 网站的一些故事
- window下php自动脚本,Windows下使用VBS实现定时执行访问URL脚本(刷流量)
热门文章
- C++静态成员函数指针
- setup2go制作安装程序
- iOS关于armv7,armv7s,arm64,i386,x86_64等问题
- c语言枚举法礼泡声次数,C语言枚举类型举例
- java启动密码,java - 用户验证密码后如何启动java applet程序? - SO中文参考 - www.soinside.com...
- 自动部署war包脚本
- 洛谷树剖模板题 P3384 | 树链剖分
- POJ 3041 Asteroids (对偶性,二分图匹配)
- ACM PKU 2559 Largest Rectangle in a Histogram http://acm.pku.edu.cn/JudgeOnline/problem?id=2559
- 详细记录丨Realtek RTL8188FU WiFi 驱动移植