位运算

2019-05-10  本文已影响0人  徐振杰

飞行员兄弟

#include<iostream>
#include<vector>
using namespace std;

//用state保存当前的状态,然后用change保存改变这个数之后需要盖面其他数的位置,最后将枚举每一种状态
int get(int i,int j){
    int pos = i*4+j;
    return 1<<pos;
}

int change[10][10];

int main(){
    
    int state = 0;
    for(int i=0;i<4;i++){
        string line;
        cin>>line;
        for(int j=0;j<4;j++){
            if(line[j]=='+')
                state += get(i,j);
        }
    }
    
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            
            for(int k =0;k<4;k++){
                change[i][j] += get(i,k);
                change[i][j] += get(k,j);
            }
            change[i][j] -= get(i,j);
        }
    }
    vector<pair<int,int>> res;
    for(int i=0;i<1<<16;i++){
        
        int now = state;
        vector<pair<int,int>> path;
        for(int j=0;j<16;j++){
            if(i>>j&1){
                now ^= change[j/4][j%4];
                path.push_back({j/4,j%4});
            }
        }
        if(!now&&(res.size()==0||res.size()>path.size())) res = path;
    }
    cout<<res.size()<<endl;
    for(auto i:res){
        cout<<i.first+1<<" "<<i.second+1<<endl;
    }
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读