LeetCode 5282. 转化为全零矩阵的最少反转次数
地址 https://leetcode-cn.com/problems/minimum-number-of-flips-to-convert-binary-matrix-to-zero-matrix/
题目描述
给你一个 m x n 的二进制矩阵 mat。
每一步,你可以选择一个单元格并将它反转(反转表示 0 变 1 ,1 变 0 )。如果存在和它相邻的单元格,那么这些相邻的单元格也会被反转。(注:相邻的两个单元格共享同一条边。)
请你返回将矩阵 mat 转化为全零矩阵的最少反转次数,如果无法转化为全零矩阵,请返回 -1 。
二进制矩阵的每一个格子要么是 0 要么是 1 。
全零矩阵是所有格子都为 0 的矩阵。
示例 :
输入:mat = [[,],[,]]
输出:
解释:一个可能的解是反转 (, ),然后 (, ) ,最后是 (, ) 。
示例 : 输入:mat = [[]]
输出:
解释:给出的矩阵是全零矩阵,所以你不需要改变它。
示例 : 输入:mat = [[,,],[,,],[,,]]
输出:
示例 : 输入:mat = [[,,],[,,]]
输出:-
解释:该矩阵无法转变成全零矩阵
提示: m == mat.length
n == mat[].length
<= m <=
<= n <=
mat[i][j] 是 或 。
算法1
本题同acwing 95. 费解的开关 acwing116. 飞行员兄弟 类似
可以考虑第一层如何全零的时候 需要按那几个开关 第二层为如何全零的时候需要按那几个开关 依次推到至最后一层得到答案
在数据范围比较大的情况也可以采用 双向BFS 进行搜索范围的优化
由于范围比较小 我就采取了比较粗暴的朴素BFS
从全零的状态作为起点 依次BFS 看看走到题目给出的状态 需要几步
简单直接
用来做记录状态的key 直接使用二维数组 而没有进行压缩变形
不过代码也比较好理解
代码如下:
class Solution {
public:
map<vector<vector<int>>, int> visit;
queue<pair<vector<vector<int>>, int>> q;
bool CheckIsAllZero(const vector<vector<int>> &mat)
{
for (int i = ; i < mat.size(); i++) {
for (int j = ; j < mat[].size(); j++) {
if (mat[i][j] != )
return false;
}
}
return true;
}
void Click(vector<vector<int>>& currenrState, int x, int y)
{
int addx[] = { ,-,, };
int addy[] = { ,,-, };
currenrState[x][y] = currenrState[x][y] ? : ;
for (int i = ; i < ; i++) {
int newx = x + addx[i];
int newy = y + addy[i];
if (newx >= && newx < currenrState.size() && newy >= && newy < currenrState[].size()) {
currenrState[newx][newy] = currenrState[newx][newy] ? : ;
}
}
}
int minFlips(vector<vector<int>>& mat) {
if (CheckIsAllZero(mat)) return ;
vector<vector<int>> matAllZero(mat.size(), vector<int>(mat[].size()));
int distance = ;
visit[matAllZero] = distance;
q.push({ matAllZero ,distance });
while (!q.empty()) {
auto qe = q.front();
q.pop();
vector<vector<int>> currenrState = qe.first;
int currentCount = qe.second;
//尝试 点击该XY
for (int i = ; i < currenrState.size(); i++) {
for (int j = ; j < currenrState[].size(); j++) {
vector<vector<int>> copy = currenrState;
Click(copy, i, j);
if (copy == mat)
{
return currentCount + ;
}
if (visit.count(copy) == ) {
q.push({ copy ,currentCount + });
visit[copy] = currentCount + ;
}
}
}
}
return -;
}
};
LeetCode 5282. 转化为全零矩阵的最少反转次数的更多相关文章
- leetcode1284 转化为全零矩阵的最少反转次数
m == mat.length n == mat[0].length 1 <= m <= 3 1 <= n <= 3 mat[i][j] 是 0 或 1 . BFS, 代码来自 ...
- [LeetCode] Minimum Moves to Equal Array Elements 最少移动次数使数组元素相等
Given a non-empty integer array of size n, find the minimum number of moves required to make all arr ...
- [LeetCode] Minimum Moves to Equal Array Elements II 最少移动次数使数组元素相等之二
Given a non-empty integer array, find the minimum number of moves required to make all array element ...
- LeetCode:最少移动次数使得数组元素相等||【462】
LeetCode:最少移动次数使得数组元素相等||[462] 题目描述 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最 ...
- Leetcode 462.最少移动次数使数组元素相等
最少移动次数使数组元素相等 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000. 例如: 输入: [1,2, ...
- Java实现 LeetCode 462 最少移动次数使数组元素相等 II
462. 最少移动次数使数组元素相等 II 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000. 例如: 输 ...
- leetcode 1541. 平衡括号字符串的最少插入次数
问题描述 给你一个括号字符串 s ,它只包含字符 '(' 和 ')' .一个括号字符串被称为平衡的当它满足: 任何左括号 '(' 必须对应两个连续的右括号 '))' . 左括号 '(' 必须在对应的连 ...
- 面试官:你有m个鸡蛋,如何用最少的次数测出鸡蛋会在哪一层碎?
假设你面前有一栋n层的大楼和m个鸡蛋,假设将鸡蛋从f层或更高的地方放扔下去,鸡蛋才会碎,否则就不会.你需要设计一种策略来确定f的值,求最坏情况下扔鸡蛋次数的最小值. leetcode原题链接 乍一看这 ...
- 面试题:对一个正整数n,算得到1需要的最少操作次数
实现一个函数,对一个正整数n,算得到1需要的最少操作次数.操作规则为:如果n为偶数,将其除以2:如果n为奇数,可以加1或减1:一直处理下去.例子:func(7) = 4,可以证明最少需要4次运算n = ...
随机推荐
- 如何在Vue项目中给路由跳转加上进度条
1.前言 在平常浏览网页时,我们会注意到在有的网站中,当点击页面中的链接进行路由跳转时,页面顶部会有一个进度条,用来标示页面跳转的进度(如下图所示).虽然实际用处不大,但是对用户来说,有个进度条会大大 ...
- P1041 传染病控制(noip2003)(搜索)
呃呃呃...真的是惨烈啊... 今天的模拟赛是真的惨..... 本题,正解居然是搜索!!!!!! 蒟蒻自己歪歪了一个貌似是正解但是却连一半都没过的错解. 先解释一下自己的dp思路把. $f[i][u] ...
- Python基本数据结构之文件操作
用word操作一个文件的流程如下: 1.找到文件,双击打开 2.读或修改 3.保存&关闭 用python操作文件也差不多: f=open(filename) # 打开文件 f.write(&q ...
- 使用 vue-element-admin 动态路由渲染
附上:vue-element-admin 官方文档 vue-element-admin https://panjiachen.github.io/vue-element-admin-site/zh/g ...
- jquery正确获取iframe里元素的方法
<iframe id="_ae_frame" width="100%" height="100%" frameborder=" ...
- F#周报2019年第46期
新闻 使用Pulumi和.NET Core创建现代云应用 宣告.NET Core 3.1预览版3 ML.NET模型构建器升级 .NET Framework修复工具 Mac上的Visual Studio ...
- 软件 ---- idea启动
1.将配置转移到别的盘符,避免重做系统后,之前的配置就没了 找到安装的位置,默认安装的话地址一般是 C:\Program Files\JetBrains\IntelliJ IDEA 2017.2 ID ...
- c#属性(Property)
属性(Property)是类(class).结构(structure)和接口(interface)的命名(named)成员.类或结构中的成员变量或方法称为 域(Field).属性(Property)是 ...
- python3 控制安卓手机的飞行模式遇到的问题汇总
一.首先调通电脑对手机能落实 adb shell命令 验证通过标准:控制wifi开关的命令,能让wifi功能开启和关闭 (adb shell svc wifi enable 和 adb she ...
- spark集群搭建(三台虚拟机)——zookeeper集群搭建(3)
!!!该系列使用三台虚拟机搭建一个完整的spark集群,集群环境如下: virtualBox5.2.Ubuntu14.04.securecrt7.3.6_x64英文版(连接虚拟机) jdk1.7.0. ...