输入样例:
-+--
----
----
-+--
输出样例:
6
1 1
1 3
1 4
4 1
4 3
4 4
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N = 5;
char g[N][N],backup[N][N];
int get(int x,int y){//计算第ij格子上的编号是多少
return x*4 + y;
}
void turn_one(int x,int y){
if(g[x][y] == '+') g[x][y] = '-';
else g[x][y] = '+';
}
//转换一整行一整列
void turn_all(int x,int y){
for(int i=0;i<4;i++){
turn_one(x,i);
turn_one(i,y);
}
turn_one(x,y);
}
int main()
{
for(int i=0;i<4;i++) cin>>g[i];
vector<PII> res;
for(int op = 0; op < 1 << 16;op ++)//,枚举所有方案
{
vector<PII> temp;
memcpy(backup,g,sizeof g);//备份
//进行操作
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
//如果当前位置是1
if(op >> get(i,j) & 1){
temp.push_back({i,j});
turn_all(i,j);
}
}
}
//判断开关是否都为开
bool has_closed = false;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(g[i][j] == '+')
has_closed = true;
}
}
if(has_closed == false){
//如果目前还没有合法方案
if(res.empty() || res.size() > temp.size()) res = temp;
}
memcpy(g,backup,sizeof g);//还原
}
cout<<res.size()<<endl;
for(auto op : res){
cout<<op.x + 1 <<" "<<op.y + 1 <<endl;
}
return 0;
}