欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

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

发布时间:2025/3/20 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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. 飞行员兄弟【二进制枚举】的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。