题目链接:http://poj.org/problem?id=1753
题目直接暴力求解即可,方法与POJ2965 一样点击打开链接
代码改动很小
#include <cstdio>
#include <cstring>
using namespace std;
int data;
int operate[16];
void set(int &data,int pos,int flag)
{
if (flag == 1)
data|=(1<<pos);
else
data&=(~(1<<pos));
}
bool getbit(const int &data,int pos)
{
return data&(1<<pos);
}
void make_operate(int operate[16])
{
memset (operate, 0, 16*sizeof(int));
for (int i = 0; i < 16; ++i)
{
set (operate[i], i, 1);
int r = i / 4;
int c = i % 4;
if (r >= 1)
set(operate[i], i-4, 1);
if (r <= 2)
set(operate[i], i+4, 1);
if (c >= 1)
set(operate[i], i-1, 1);
if (c <= 2)
set(operate[i], i+1, 1);
}
}
int main()
{
int data;
int operate[16];
make_operate(operate);
char tmp[6];
data = 0;
for (int i = 0; i < 4; ++i)
{
scanf ("%s", tmp);
for (int j = 0; j < 4; ++j)
{
if (tmp[j] == 'b')
set(data, i*4+j, 1);
else
set(data, i*4+j, 0);
}
}
int tmpdata = data;
int solution;
int min = 17;
for (solution = 0; solution < 65536; ++solution)
{
for (int i = 0; i < 16; ++i)
{
if (getbit(solution, i))
tmpdata ^= operate[i];
}
if (tmpdata == 0 || tmpdata == 65535)
{
int count = 0;
for (int i = 0; i < 16; ++i)
{
if (getbit(solution, i))
count += 1;
}
if (count < min)
{
min = count;
}
}
tmpdata = data;
}
if (min == 17)
printf("Impossible\n");
else
{
printf ("%d\n", min);
}
return 0;
}