地址  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. 转化为全零矩阵的最少反转次数的更多相关文章

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

    m == mat.length n == mat[0].length 1 <= m <= 3 1 <= n <= 3 mat[i][j] 是 0 或 1 . BFS, 代码来自 ...

  2. [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 ...

  3. [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 ...

  4. LeetCode:最少移动次数使得数组元素相等||【462】

    LeetCode:最少移动次数使得数组元素相等||[462] 题目描述 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最 ...

  5. Leetcode 462.最少移动次数使数组元素相等

    最少移动次数使数组元素相等 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000. 例如: 输入: [1,2, ...

  6. Java实现 LeetCode 462 最少移动次数使数组元素相等 II

    462. 最少移动次数使数组元素相等 II 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000. 例如: 输 ...

  7. leetcode 1541. 平衡括号字符串的最少插入次数

    问题描述 给你一个括号字符串 s ,它只包含字符 '(' 和 ')' .一个括号字符串被称为平衡的当它满足: 任何左括号 '(' 必须对应两个连续的右括号 '))' . 左括号 '(' 必须在对应的连 ...

  8. 面试官:你有m个鸡蛋,如何用最少的次数测出鸡蛋会在哪一层碎?

    假设你面前有一栋n层的大楼和m个鸡蛋,假设将鸡蛋从f层或更高的地方放扔下去,鸡蛋才会碎,否则就不会.你需要设计一种策略来确定f的值,求最坏情况下扔鸡蛋次数的最小值. leetcode原题链接 乍一看这 ...

  9. 面试题:对一个正整数n,算得到1需要的最少操作次数

    实现一个函数,对一个正整数n,算得到1需要的最少操作次数.操作规则为:如果n为偶数,将其除以2:如果n为奇数,可以加1或减1:一直处理下去.例子:func(7) = 4,可以证明最少需要4次运算n = ...

随机推荐

  1. mysql约束条件

    约束条件 (测试markdown 编辑器专用) null 允许为空 not null 不允许为空 key 键值类型 default 设置默认类型,缺省值为NULL extra 额外设置 CREATE ...

  2. CSPS模拟99

    555我原型笔录 T1 不会线段树维护单调栈被dalao们踩爆 T2 我要实现这样一个东西: 已知a,b,c,使a=a-b,b=b-c 结果我把代码弄成这样: b=b-c;a=a-b; 然后就被dal ...

  3. 理解PostgreSQL的模式、表、空间、用户间的关系

    在平时的工作中,我们经常接触到数据库表和用户以及角色的使用,由于经常使用默认的数据库表空间和模式(Schema),所以我们往往忽略了数据库表空间和模式的概念以及作用. 接下来,先介绍一下模式和表空间的 ...

  4. day7-集合

    一.定义变量是为了吹处理状态的变化,定义变量名是为了获取变量值.字符串.数字.列表.元组.字典都是为了更好的描述变量的状态1.可变不可变:变量名不变时,里面内容是否可以变化# 可变:列表.字典.修改变 ...

  5. 三石之道之Ansible自动化运维工具部署

    centos6默认python版本为2.6 centos7默认python版本为2.7 ansible需要最低python2.7的支持 总结:centos6要部署ansible工具,需要先升级pyth ...

  6. etcd-operator快速入门完全教程

    Operator是指一类基于Kubernetes自定义资源对象(CRD)和控制器(Controller)的云原生拓展服务,其中CRD定义了每个operator所创建和管理的自定义资源对象,Contro ...

  7. 用c语言打印一个三角形

    #define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h&g ...

  8. 暑假CV-QKD的相关论文单词集(第一弹)

    CV-QKD  连续变量-量子秘钥分发 Quadrature  正交 Photon     光子 Coherent    连续的,连贯的 Reconciliation   调解 Cryptograph ...

  9. 除了获取 MAC 地址还能干啥

            以前写过一篇<在Web中获取MAC地址>的文章,文章的地址是:https://www.cnblogs.com/tosser/p/9022187.html,我当时使用 OCX ...

  10. nyoj 96-n-1位数 (strlen, atoi, ceil)

    96-n-1位数 内存限制:64MB 时间限制:3000ms 特判: No 通过数:30 提交数:47 难度:1 题目描述: 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2) ...