蓝桥杯-飞行兄弟
链接: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号