LeetCode 1284. 转化为全零矩阵的最少反转次数 (BFS)

转化为全零矩阵的最少反转次数
和力扣 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;
    }   
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/107644146