一个与poj 1753 类似的题目不过是将改四个方向的状态变成了改变所要求的行和列的状态。
#include<stdio.h> #include<string.h> char s[5][5]; int e[5][5],b[5][5],flag,step; void qq(int o,int p) { int i; b[o][p]=!b[o][p]; for(i=1;i<5;i++) { if(b[o][i]==1) b[o][i]=0; else b[o][i]=1; } for(i=1;i<5;i++) { if(b[i][p]==1) b[i][p]=0; else b[i][p]=1; } } int yy() { int i,j; for(i=1;i<5;i++) { for(j=1;j<5;j++) { if(b[i][j]!=1) return 0; } } return 1; } void show(int r,int t,int y) { int d; if(r==step) { d=yy(); if(d) flag=1; return ; } if(flag||t==5) return ; qq(t,y); e[r][0]=t; e[r][1]=y; if(y<4) show(r+1,t,y+1); else show(r+1,t+1,1); qq(t,y); if(y<4) show(r,t,y+1); else show(r,t+1,1); } int main() { int i,j; memset(b,0,sizeof(b)); for(i=1;i<5;i++) { for(j=1;j<5;j++) { scanf("%c",&s[i][j]); if(s[i][j]=='-') b[i][j]=1; } getchar(); } memset(e,0,sizeof(e)); for(step=0;step<=16;step++) { show(0,1,1); if(flag) break; } printf("%d\n",step); for(i=0;i<step;i++) { printf("%d %d\n",e[i][0],e[i][1]); } return 0; }