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();
//printf("<%d %d>\n",now,mp[now]-1);
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;
}
};
No.145 - LeetCode1284 - 状压BFS - 黑白棋
最新推荐文章于 2022-09-22 14:07:17 发布