สมมติว่าเรามีเสื่อเมทริกซ์ไบนารีขนาด m x n ในขั้นตอนเดียว เราสามารถเลือกเซลล์หนึ่งเซลล์แล้วพลิกบิตและเซลล์เพื่อนบ้านทั้งสี่เซลล์หากมีอยู่ เราต้องหาจำนวนขั้นตอนขั้นต่ำที่จำเป็นในการแปลง mat เป็นเมทริกซ์ศูนย์ หากไม่มีวิธีแก้ปัญหา ให้คืนค่า -1
ดังนั้นหากอินพุตที่กำหนดเป็น [[0,0], [0,1]] การเปลี่ยนแปลงจะเป็นเช่น −

ดังนั้นเราต้องการ 3 ขั้นตอน ผลลัพธ์จะเป็น 3
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- n :=จำนวนแถว, m :=จำนวนคอลัมน์, x :=0
- สำหรับการเริ่มต้น i :=0 เมื่อฉัน
- สำหรับการเริ่มต้น j :=0 เมื่อ j
- สำหรับการเริ่มต้น j :=0 เมื่อ j
- x :=x + left shift mat[i][j] value (i * m) + j) จำนวนครั้ง
- สำหรับการเริ่มต้น j :=0 เมื่อ j
- ส่งคืน dp[ปัจจุบัน]
- ni :=i + dir[k][0]
- nj :=j + dir[k][1]
- ถ้า ni <0 หรือ nj <0 หรือ ni>=n หรือ nj>=m แล้ว −
- ไม่ต้องสนใจตอนต่อไป ข้ามไปที่ตอนต่อไป
- อุณหภูมิ :=อุณหภูมิ XOR 2^ (ni * m) + nj)
- dp[ชั่วคราว] :=dp[ปัจจุบัน] + 1
- ใส่อุณหภูมิลงใน q
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
int dir[4][2] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}};
class Solution {
public:
int minFlips(vector<vector<int>>& mat) {
int n = mat.size();
int m = mat[0].size();
int x = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
x += (mat[i][j] << ((i * m) + j));
}
}
vector < int > dp(1 << (n*m), -1);
dp[x] = 0;
queue <int> q;
q.push(x);
while(!q.empty()){
int current = q.front();
q.pop();
if(current == 0)return dp[current];
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
int temp = current;
temp ^= (1 << ((i *m) + j));
for(int k = 0; k < 4; k++){
int ni = i + dir[k][0];
int nj = j + dir[k][1];
if(ni < 0 || nj < 0 || ni >= n || nj >= m)continue;
temp ^= (1 << ((ni *m) + nj));
}
if(dp[temp] == -1){
dp[temp] = dp[current] + 1;
q.push(temp);
}
}
}
}
return -1;
}
};
main(){
Solution ob;
vector<vector<int>> v = {{0,0},{0,1}};
cout << (ob.minFlips(v));
} อินพุต
{{0,0},{0,1}} ผลลัพธ์
3