本题大致与poj1753相同,唯一难点是记录翻转过程,其他详见poj1753
//Memory Time
//132K 610ms
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node{//用来储存过程
int row,col;
}p[16];
int chess[4][4];
int step;
int flag;
int judge()//判断是否打开
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(chess[i][j]!=1)
return 0;
return 1;
}
void reverse(int row,int col)//翻转开关
{
for(int i=0;i<4;i++)
{
if(chess[row][i]==1)
chess[row][i]=0;
else
chess[row][i]=1;
}
for(int i=0;i<4;i++)
{
if(i!=row)
{
if(chess[i][col]==1)
chess[i][col]=0;
else
chess[i][col]=1;
}
}
}
int dfs(int row,int col,int deep)
{
if(deep==step)
{
return flag=judge();
}
if(flag||row>=4)
return 0;
reverse(row,col);
p[deep].row=row+1;//记录过程
p[deep].col=col+1;
if(col<3)
dfs(row,col+1,deep+1);
else
dfs(row+1,0,deep+1);
reverse(row,col);//若前面的行不通则开关复位
if(col<3)
dfs(row,col+1,deep);
else
dfs(row+1,0,deep);
}
int main()
{
char t;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
scanf("%c",&t);
if(t=='-')
chess[i][j]=1;
else
chess[i][j]=0;
}
getchar();
}
for(step=0;step<=16;step++)//为什么最大步数为16 详见poj1753
{
dfs(0,0,0);
if(flag)
{
printf("%d\n",step);
break;
}
}
for(int i=0;i<step;i++)
printf("%d %d\n",p[i].row,p[i].col);
return 0;
}