与上题都是递归枚举题,不同的是这题需要输出结果,所以使用数组保存中间结果,因为最多按16次开关,且开关位置由x,y确定,所以用两个一维数组保存每次按开关的x和y的值,而不用麻烦的使用结构体。
#include <iostream>
using namespace std;
int s[4][4];
int m;
int r[16],c[16];
int flag = 0;
void switching(int x,int y,int k){
r[k] = x;
c[k] = y;
for(int i = 0;i < 4;i++)
s[x][i] ^= 1;
for(int i = 0;i < 4;i++)
s[i][y] ^= 1;
s[x][y] ^= 1;
}
bool open(){
for(int i = 0;i < 4;i++){
for(int j = 0;j < 4;j++){
if(s[i][j] == 0) return false;
}
}
return true;
}
void dfs(int cur,int k){
if(k == m){
if(open()) flag = 1;
return;
}
if(flag || cur == 16) return;
else{
switching(cur/4,cur%4,k);
dfs(cur+1,k+1);
switching(cur/4,cur%4,k);
dfs(cur+1,k);
}
}
void dfstravel(){
for(m = 1;m <= 16;m++){
dfs(0,0);
if(flag){
cout<<m<<endl;
for(int i = 0;i < m;i++){
cout<<r[i]+1<<" "<<c[i]+1<<endl;
}
return;
}
}
}
int main(){
freopen("in.txt","r",stdin);
char c1;
for(int i = 0;i < 4;i++){
for(int j = 0;j < 4;j++){
cin>>c1;
if(c1 == '-') s[i][j] = 1;
else s[i][j] = 0;
}
}
dfstravel();
return 0;
}