这个题是一个枚举题。
用的是八皇后算法。
具体操作不说了。
下面是代码:
#include <stdio.h>
struct node
{
int x,y;
}de[200],dr[200];
int a[17],b,w,min,cut;
void ro(int i)
{
int j=4;
while(i-j>=0)
{
if(a[i-j]==0)
{
a[i-j]=1;
w--;
b++;
}
else
{
a[i-j]=0;
w++;
b--;
}
j+=4;
}
j=4;
while(i+j<16)
{
if(a[i+j]==0)
{
a[i+j]=1;
w--;
b++;
}
else
{
a[i+j]=0;
w++;
b--;
}
j+=4;
}
}
void co(int i)
{
int j=1;
while(i+j<16&&i/4==(i+j)/4)
{
if(a[i+j]==0)
{
a[i+j]=1;
w--;
b++;
}
else
{
a[i+j]=0;
w++;
b--;
}
j++;
}
j=1;
while(i-j>=0&&i/4==(i-j)/4)
{
if(a[i-j]==0)
{
a[i-j]=1;
w--;
b++;
}
else
{
a[i-j]=0;
w++;
b--;
}
j++;
}
}
void fib(int i)
{
int j,g;
if(i==-1)
{
for(j=i+1; j<16; j++)
{
fib(j);
}
}
else
{
if(cut==0&&b==0)
{
min=cut;
return ;
}
if(a[i]==0)
{
a[i]=1;
w--;
b++;
}
else
{
a[i]=0;
w++;
b--;
}
ro(i);
co(i);
de[cut].x=i/4;
de[cut].y=i%4;
cut++;
if(b==0&&min>cut)
{
for(g=0;g<cut;g++)
{
dr[g]=de[g];
}
min=cut;
}
else
{
for(j=i+1; j<16; j++)
{
fib(j);
}
}
if(a[i]==0)
{
a[i]=1;
w--;
b++;
}
else
{
a[i]=0;
w++;
b--;
}
ro(i);
co(i);
cut--;
}
}
int main()
{
int i,j;
char s[6];
while(scanf("%s",s)!=EOF)
{
b=0;
w=0;
min=1<<30;
cut=0;
for(i=0; i<4; i++)
{
if(s[i]=='+')
{
a[i]=1;
b++;
}
else if(s[i]=='-')
{
a[i]=0;
w++;
}
}
for(i=1; i<4; i++)
{
scanf("%s",s);
for(j=0; j<4; j++)
{
if(s[j]=='+')
{
a[i*4+j]=1;
b++;
}
else if(s[j]=='-')
{
a[i*4+j]=0;
w++;
}
}
}
fib(-1);
printf("%d\n",min);
for(i=0; i<min; i++)
{
printf("%d %d\n",dr[i].x+1,dr[i].y+1);
}
}
return 0;
}