#include<iostream>
char data[16];
int a[16];
int d[4] = { -4, 1, 4, -1 };
char b[16];
int flag;
int count = 0;
int min = 1000;
int sum;
void dfs(int step)
{
sum = 0;
for (int i = 0; i < step; i++)
{
sum = sum + a[i];
}
if (sum >= min)
return;
if (step == 16)
{
count = 0; flag = 1;
for (int i = 0; i<16; i++)
b[i] = data[i];
for (int i = 0; i<16; i++)
{
if (a[i] == 1)
{
if (b[i] == ‘b‘)
{
b[i] = ‘w‘;
}
else
{
b[i] = ‘b‘;
}
for (int j = 0; j<4; j++)
{
if (i + d[j] >= 0 && i + d[j]<16)
{
if (b[i + d[j]] == ‘w‘)
{
b[i + d[j]] = ‘b‘;
}
else
{
b[i + d[j]] = ‘w‘;
}
}
}
}
}
for (int i = 0; i<16; i++)
{
if (b[0] == b[i])
flag = 1;
else
{
flag = 0;
break;
}
}
if (flag == 1)
{
//printf("!!");
for (int i = 0; i<16; i++)
{
if (a[i] == 1)
count++;
}
//printf("%d", count);
if (count < min)
min = count;
}
// printf("%d", min);
return;
}
for (int i = 0; i<2; i++)
{
a[step] = i;
dfs(step + 1);
}
}
int main()
{
freopen("input.txt", "r", stdin);
for (int i = 0; i<16; i++)
{
if (i == 4 || i == 8 || i == 12)
getchar();
scanf("%c", &data[i]);
}
for (int i = 0; i<16; i++)
{
b[i] = data[i];
}
dfs(0);
printf("%d", min);
}
原文:http://www.cnblogs.com/dahuacarry/p/6250702.html