日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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]01

來源:力扣(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 矩阵状态编码解码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。