简单来说,利用位运算,1为操作,0为不操作
C++ 代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef pair<int,int> PII;
const int N = 6;
char g[N][N];
char temp[N][N];
int res = 0x3f3f3f3f;
PII answer[16];
PII true_answer[16];
int dx[12]={-1,-2,-3,1,2,3,0,0,0,0,0,0},dy[12]={0,0,0,0,0,0,-1,-2,-3,1,2,3};
void turn(int x,int y)
{
if(temp[x][y]=='+')temp[x][y]='-';
else temp[x][y]='+';
}
void change(int x,int y)
{
turn(x,y);
for(int i = 0 ; i<12 ; i++)
{
int a=x+dx[i],b=y+dy[i];
if(a>=0&&a<4&&b>=0&&b<4)
{
turn(a,b);
}
}
}
bool judge()
{
bool flag= true;
for(int i = 0 ; i<4 ; i++)
for(int j = 0 ; j<4 ; j++)
if(temp[i][j]=='+')flag=false;
return flag;
}
int main()
{
for(int i = 0 ; i<4 ; i++)scanf("%s",g[i]);
for(int op = 0 ; op < 1<<16 ; op++) // 暴力枚举,总共的开关方式共有2^16次方个
{
memcpy(temp,g,sizeof(g));
int cnt = 0;
for(int i = 0 ; i<16 ; i++)
{
if(op>>i&1)
{
int x=i/4,y=i%4;
change(x,y);
answer[cnt]={x,y};
cnt++;
}
}
if(judge())
{
res=min(res,cnt);
memcpy(true_answer,answer,sizeof(answer));
}
}
cout<<res<<endl;
for(int i = 0 ; i<res ; i++)
{
int a = true_answer[i].first,b=true_answer[i].second;
cout<<a+1<<' '<<b+1<<endl;
}
return 0;
}