class Solution {
public:
int getStatus(int loc,int status,int N,int M){
status ^= (1<<loc);
if(loc % M != 0) status ^= (1<<(loc-1));
if((loc+1) % M != 0) status ^= (1<<(loc+1));
if(loc/M < N-1) status ^= (1<<(loc+M));
if(loc/M > 0) status ^= (1<<(loc-M));
return status;
}
int minFlips(vector<vector<int>>& mat) {
int N = mat.size();
int M = mat[0].size();
queue<int> q;
int status = 0;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
status<<=1;
if(mat[i][j] == 1) status++;
}
}
if(status == 0) return 0;
map<int,int> mp;
q.push(status);
mp[status] = 1;
while(!q.empty()){
int now = q.front();
q.pop();
for(int i=0;i<N*M;i++){
int newstatus = getStatus(i,now,N,M);
if(newstatus == 0) return mp[now];
if(mp[newstatus] == 0){
q.push(newstatus);
mp[newstatus] = mp[now]+1;
}
}
}
return -1;
}
};