题目描述
飞行员兄弟
算法
暴力枚举
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int,int> PII;
const int N = 5;
char init[N][N], cal[N][N];
void changeone(int i, int j){
if(cal[i][j] == '+') cal[i][j] = '-';
else cal[i][j] = '+';
}
void change(int i, int j){
for(int k = 0; k < 4; ++ k){
changeone(k,j);
changeone(i,k);
}
changeone(i,j);
}
int func(int i, int j){
return i*4+j;
}
signed main()
{
// 答案
vector<PII> res;
// 输入
for(int i = 0; i < 4; ++ i) cin >> init[i];
// 遍历求解
for(int op = 0; op < 1 << 16; ++ op)
{
//初始化
vector<PII> temp;
bool flag = false;
memcpy(cal,init,sizeof cal);
// 求解
for(int i = 0; i < 4; ++ i)
for(int j = 0; j < 4; ++ j)
if(op >> func(i,j) & 1) {
change(i,j);
temp.push_back(pair(i,j));
}
// 判断是否全开
for(int i = 0; i < 4; ++ i)
for(int j = 0; j < 4; ++ j)
if(cal[i][j] == '+') flag = true;
// 判断最优解
if(!flag)
if(res.empty()||temp.size()<res.size()) res = temp;
}
// 输出
cout << res.size() << endl;
for(auto c : res)
cout <<c.first + 1 <<" "<<c.second + 1 <<endl;
return 0;
}