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. 飞行员兄弟二进制枚举的主要内容,如果未能解决你的问题,请参考以下文章