#include <cstdio>
#include <cstdlib>
using namespace std;
int arr[16], new_arr[16];
int ARR_LEN = 16;
int NUM, last = 0;
int result[16];
//题目要点是确定翻转组合。定义数组副本,翻转时用,递归结束还原。重点是组合的选择与保存
void printM(void)
{
printf("\n\n");
for(int i = 0; i < 16; i++)
{
printf("%d ",new_arr[i]);
if(i%4 == 3)
printf("\n");
}
printf("\n\n");
}
bool all_white_or_black(void)
{
for(int i = 1; i < 16; i++)
{
if(new_arr[i]!=new_arr[i - 1])
return false;
}
return true;
}
void turn_over(int i)
{
new_arr[i] = (new_arr[i] + 1)%2;
int x = i/4;
int y = i%4;
if(x>0)
new_arr[i-4] = (new_arr[i-4] + 1)%2;
if(x<3)
new_arr[i+4] = (new_arr[i+4] + 1)%2;
if(y<3)
new_arr[i+1] = (new_arr[i+1] + 1)%2;
if(y>0)
new_arr[i-1] = (new_arr[i-1] + 1)%2;
}
void combination(int start, int count)
{
for(int i = start; i < ARR_LEN + 1 - count; i++)
{
result[count - 1] = i;
if(count == 1)
{
for(int j = 0; j < 16; j++)
new_arr[j] = arr[j];
for(int j = NUM - 1; j >= 0; j--)
turn_over(result[j]);
if(all_white_or_black())
{
last = NUM;
break;
}
}
else
combination(i + 1, count - 1);
}
}
int main(void)
{
char str[5];
for(int i = 0; i < 4; i++)
{
scanf("%s", str);
for(int j = 0; j < 4; j++)
{
if(str[j] == 'b')
arr[i*4+j] = 0;
else
arr[i*4+j] = 1;
}
}
for(int i = 0; i < 16; i++)
new_arr[i] = arr[i];
if(all_white_or_black())
{
printf("0\n");
return 0;
}
int i;
for(i = 1; i < 17; i++)
{
NUM = i;
combination(0, i);
if(last != 0)
break;
}
if(i == 17)
printf("Impossible\n");
else
printf("%d\n", last);
return 0;
}
poj-1753
最新推荐文章于 2020-08-08 03:19:35 发布