116. 飞行员兄弟二进制枚举

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了116. 飞行员兄弟二进制枚举相关的知识,希望对你有一定的参考价值。


二进制枚举即可,需要注意的是,这道题和费解的开关还是有不同点的。
费解的开关枚举第一行就行了,因为它有依赖关系的。
而这个是一个十字形,无那种关系。故直接暴力枚举邓按不按的所有情况即可。

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
string a[10],b[15];
char get(char c)

    if(c=='-') return '+';
    if(c=='+') return '-';

void solve(int x,int y)

    for(int i=0;i<4;i++) 
        b[x][i]=get(b[x][i]),b[i][y]=get(b[i][y]);
    b[x][y]=get(b[x][y]);

int main(void)

    for(int i=0;i<4;i++) cin>>a[i];
    vector<PII>ans;
    for(int i=0;i<(1<<16);i++)
    
        vector<PII>ve;
        for(int j=0;j<4;j++) b[j]=a[j];
        for(int j=0;j<16;j++)
        
            if( (i>>j) & 1 )
            
                solve(j/4,j%4);
                ve.push_back(j/4,j%4);
            
        
        bool flag=1;
        for(int j=0;j<4;j++)
            for(int k=0;k<4;k++)
                if(b[j][k]=='+') flag=0;
        if(flag&&(ans.size()>ve.size()||ans.empty())) ans=ve;
        
    
    cout<<ans.size()<<endl;
    for(int i=0;i<ans.size();i++) 
        cout<<ans[i].first+1<<" "<<ans[i].second+1<<'\\n';
    return 0;

以上是关于116. 飞行员兄弟二进制枚举的主要内容,如果未能解决你的问题,请参考以下文章

116. 飞行员兄弟

AcWing 飞行员兄弟 二进制枚举

飞行兄弟二进制枚举+异或

acwing 116. 飞行员兄弟

飞行员兄弟 DFS+枚举

《算法竞赛进阶指南》0.8总结与练习