转化为全零矩阵的最少反转次数
和力扣 773 题十分相似。
const int dx[] = {-1,0,1,0};
const int dy[] = {0,1,0,-1};
class Solution {
public:
typedef vector<vector<int>> V;
int vis[1000] = {0};
int m, n, dpt = 0;
int getID(const V& v){
int p = 1, res = 0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
res += p*v[i][j];
p *= 2;
}
}
return res;
}
void change(V& v,int x,int y){
v[x][y] = !v[x][y];
for(int k=0;k<4;k++){
int nx = x+dx[k];
int ny = y+dy[k];
if(nx>=0 && ny>=0 && nx<m && ny<n){
v[nx][ny] = !v[nx][ny];
}
}
}
int minFlips(vector<vector<int>>& a) {
m = a.size();
n = a[0].size();
queue<V> q;
int init = getID(a);
if(init==0) return 0;
vis[init] = 1;
q.push(a);
while(q.size()){
int size = q.size();
while(size--){
V v = q.front();
q.pop();
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
V nv = v;
change(nv,i,j);
int ID = getID(nv);
if(ID == 0) return dpt+1;
if(vis[ID]==0){
q.push(nv);
vis[ID] = 1;
}
}
}
}
dpt++;
}
return -1;
}
};