2017-10-5
解答
直接枚举即可
代码
#include<iostream>
using namespace std;
const int N = 4;
char x[N+1][N+1],y[N+1][N+1];
int z[N+1][N+1];
int s;
bool f=false;
void set(int p,int q){
for (int i=1;i<=N;i++){
if (x[i][q]=='-') x[i][q]='+';
else x[i][q]='-';
if (x[p][i]=='-') x[p][i]='+';
else x[p][i]='-';
}
if (x[p][q]=='+') x[p][q]='-';
else x[p][q]='+';
}
void init(){
int i,j;
for (i=1;i<=N;i++){
for (j=1;j<=N;j++){
x[i][j]=y[i][j];
}
}
}
void show(){
int i,j;
cout<<s<<endl;
for (i=1;i<=N;i++){
for (j=1;j<=N;j++){
if (z[i][j]) cout<<i<<" "<<j<<endl;
}
}
}
bool res(){
int i,j;
s=0;
for (i=1;i<=N;i++){
for (j=1;j<=N;j++){
if (z[i][j]){
set(i,j);
s=s+1;
}
}
}
for (i=1;i<=N;i++){
for (j=1;j<=N;j++){
if (x[i][j]=='+') return false;
}
}
return true;
}
void dfs(int p,int q){
if (f) return ;
if (p==N+1){
if (res()){
f=true;
show();
}
init();
return ;
}
if (q==N+1){
dfs(p+1,1);
return ;
}
z[p][q]=1;
dfs(p,q+1);
z[p][q]=0;
dfs(p,q+1);
}
int main(){
int i,j;
for (i=1;i<=N;i++){
for (j=1;j<=N;j++){
cin>>x[i][j];
y[i][j]=x[i][j];
}
}
dfs(1,1);
return 0;
}