蓝桥杯-飞行兄弟
链接:https://www.acwing.com/problem/content/118/
思路:对于每个点只可能存在两种情况:选与不选,对于每个点的选择顺序没有影响,所以可以进行指数枚举后判断即可。
坑点:注意写change函数的时候,(x,y)位置不要改变两次
代码:
#include<bits/stdc++.h>
using namespace std;
int a[5][5];
int b[5][5];
int cou(int x,int y){
    return 4*(x-1)+(y-1);
}
void ch(int x,int y){
    for(int i=1;i<=4;i++){
        b[x][i]^=1;
        b[i][y]^=1;
    }
    b[x][y]^=1;//注意写change函数的时候,(x,y)位置不要改变两次
}
bool check(){
    for(int i=1;i<=4;i++)
        for(int j=1;j<=4;j++)
            if(!b[i][j])return false;
    return true;
}
vector<pair<int,int> >atm,res;
int main (){
    char c;
    for(int i=1;i<=4;i++)
        for(int j=1;j<=4;j++){
           cin>>c;
           if(c=='+')a[i][j]=0;
           else a[i][j]=1;
        }
    
    int num=0x3f3f3f3f;
    for(int i=0;i<(1<<16);i++){
        int ans=0;
        memcpy(b,a,sizeof(a));
        for(int x=1;x<=4;x++)
            for(int y=1;y<=4;y++){
                if(i&(1<<cou(x,y))){
                    ans++;
                    ch(x,y);
                    atm.push_back(make_pair(x,y));
                }
            }
        if(check()&&ans<num){
            num=ans;
            res=atm;
        }
        atm.clear();
    }
    cout<<num<<endl;
    for(int i=0;i<res.size();i++)
        cout<<res[i].first<<" "<<res[i].second<<endl;
    return 0;
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号