太懒了…改了1753的代码提交的。
两个题的不同在于本题需要把翻转步骤给写出来,所以查找的时候进行一下记录就好。
AC代码:
#include<stdio.h>
#define bool char
#define true 1
#define false 0
char a[5][5];
int b[40];
int c[40];
bool all=false;
int mm=100;
void flip(int n,int m,int flag)
{
int i,j;
for(i=1;i<=4;i++)
{
if(a[n][i]=='-')
a[n][i]='+';
else
a[n][i]='-';
}
for(i=1;i<=4;i++)
{
if(i==n)
continue;
if(a[i][m]=='-')
a[i][m]='+';
else
a[i][m]='-';
}
if(flag!=0)
b[flag*2-1]=n;
b[flag*2]=m;
}
bool pan()
{
int i,j;
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
if(a[i][j]!='-')
return false;
return true;
}
void meiju(int n,int m,int num)
{
int i,j,k;
for(i=1;i<=4;i++)
{
for(j=1;j<=4;j++)
{
if(i<n||(i==n&&j<=m))
continue;
flip(i,j,num); //改变
if(pan()&&num<mm)
{
mm=num;
for(k=0;k<=2*mm;k++)
c[k]=b[k];
all=true;
}
meiju(i,j,num+1);
flip(i,j,0); //还原
}
}
}
int main()
{
int i,j;
for(i=1;i<=4;i++){
for(j=1;j<=4;j++)
{
scanf("%c",&a[i][j]);
}
getchar();
}
if(pan())
{
printf("0");
return 0;
}
else
{
meiju(0,0,1);
printf("%d\n",mm);
for(i=1;i<=mm;i++)
printf("%d %d\n",c[2*i-1],c[2*i]);
}
return 0;
}