代码参考:https://blog.csdn.net/u013476556/article/details/30781771
POJ 2965
#include<cstdio>
#include<cstring>
const int inf=9999999;
char s[10];
int map[10][10],i,j;
int ans=inf;
int rec[10][10];
int log[10][10];
int panduan() {
for (i=0; i<4; i++) {
for (j=0; j<4; j++) {
if (map[i][j]!=1)
return 0;
}
}
return 1;
}
void fan (int x,int y) {
rec[x][y]=!rec[x][y];
map[x][y]=!map[x][y];
for(i=0; i<4; i++) {
map[x][i]=!map[x][i];
map[i][y]=!map[i][y];
}
}
int dfs (int x,int y,int t) {
if ( panduan()) {
if (ans > t)
ans = t ;
for (i=0; i<4; i++) {
for (j=0; j<4; j++) {
log[i][j]=rec[i][j];
}
}
return 0;
}
if (x >= 4 || y >= 4)
return 0;
int nx,ny;
nx = (x + 1)%4;//从第一行依次
ny = y + ( x + 1 ) / 4;//
dfs (nx,ny,t);
fan (x,y);//翻棋
dfs (nx,ny,t+1);
fan (x,y);//翻回来
return 0;
}
int main () {
memset(rec,0,sizeof(rec));
for (i=0; i<4; i++) {
scanf ("%s",s);
for (j=0; j<4; j++) {
if (s[j]=='+')
map[i][j]=0; //closed
else
map[i][j]=1; //open
}
}
dfs (0,0,0);
printf ("%d\n",ans);
for(i=0; i<4; i++) {
for(j=0; j<4; j++) {
if(log[i][j]&1) printf("%d %d\n",i+1,j+1);
//printf("%d ",log[i][j]);
}
//printf("\n");
}
return 0;
}