#include<stdio.h>
#include<string.h>
int source,steps;
int dy[]={0,0,0,1,-1},dx[]={0,1,-1,0,0};
void init()
{
char ch;
source=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
source=(source<<1)+((ch=getchar())=='b'?1:0);
getchar();
}
}
void flip(int x,int y,int& source)
{
if(x>=0&&x<=3&&y>=0&&y<=3)
source^=1<<(4*x+y);
}
void dfs(int dept,int num,int source,int flag)
{
if(dept==4){
if(source==0xffff||source==0)
steps=steps<num?steps:num;
return ;
}
int x,y;
for(int i=dept-1,j=0;j<4;j++){
if(((source&(1<<(4*i+j)))>>(4*i+j))^flag){
for(int k=0;k<5;k++){
x=dept+dx[k];
y=j+dy[k];
flip(x,y,source);
}
num++;
}
}
dfs(dept+1,num,source,flag);
}
int solve()
{
steps=0x7fffffff;
for(int i=0;i<16;i++){
int num=0,temp=source,x,y;
for(int j=0;j<4;j++){
if(i&(1<<j)){//将0-15中全部可能的改变的状态全部列举出来了
for(int k=0;k<5;k++){
x=0+dx[k];
y=j+dy[k];
flip(x,y,temp);
}
num++;
}
}
dfs(1,num,temp,0);
dfs(1,num,temp,1);
}
return steps==0x7fffffff?-1:steps;
}
int main()
{
init();
if(solve()!=-1)
printf("%d\n",steps);
else
printf("Impossible\n");
return 0;
}
#include<stdio.h>
int a[17],b[17],t[17];
int check()
{
int i,sum=0;
for (i=1;i<=16;i++)
sum+=b[i];
if (sum==16||sum==0)
return 1;
return 0;
}
void turn(int s)
{
int x,y;
x=(s-1)/4+1;y=(s-1)%4+1;
if (x>1)
b[s-4]=1-b[s-4];
if (x<4)
b[s+4]=1-b[s+4];
if (y>1)
b[s-1]=1-b[s-1];
if (y<4)
b[s+1]=1-b[s+1];
b[s]=1-b[s];
}
int main()
{
int i,j,step,ans;
char ch;
for (i=1;i<=4;i++)
{
for (j=1;j<=4;j++)
{
scanf("%c",&ch);
if (ch=='w')
a[i*4-4+j]=1;
else
a[i*4-4+j]=0;
}
scanf("%c",&ch);
}
ans=17;
for (t[1]=0;t[1]<=1;t[1]++)
for (t[2]=0;t[2]<=1;t[2]++)
for (t[3]=0;t[3]<=1;t[3]++)
for (t[4]=0;t[4]<=1;t[4]++)
for (t[5]=0;t[5]<=1;t[5]++)
for (t[6]=0;t[6]<=1;t[6]++)
for (t[7]=0;t[7]<=1;t[7]++)
for (t[8]=0;t[8]<=1;t[8]++)
for (t[9]=0;t[9]<=1;t[9]++)
for (t[10]=0;t[10]<=1;t[10]++)
for (t[11]=0;t[11]<=1;t[11]++)
for (t[12]=0;t[12]<=1;t[12]++)
for (t[13]=0;t[13]<=1;t[13]++)
for (t[14]=0;t[14]<=1;t[14]++)
for (t[15]=0;t[15]<=1;t[15]++)
for (t[16]=0;t[16]<=1;t[16]++)
{
for (i=1;i<=16;i++)
b[i]=a[i];
for (i=1;i<=16;i++)
if (t[i])
turn(i);
if (check())
{
step=0;
for (i=1;i<=16;i++)
step=step+t[i];
if (step<ans)
ans=step;
}
}
if (ans<=16)
printf("%d\n",ans);
else
printf("Impossible");
return 0;
}
#include "iostream"
using namespace std;
unsigned short int flips[16]={0xc800,0xe400,0x7200,0x3100,0x8c80,0x4e40,0x2720,0x1310,
0x08c8,0x04e4,0x0272,0x0131,0x008c,0x004e,0x0027,0x0013};
int min1=16;
unsigned short int poww2(int n)
{
int i=1;
i=i<<n;
return i;
}
void bsp(unsigned short int number,int step,int flip)
{
if(number==0||number==0xffff)
{
min1=(min1<flip?min1:flip);
return ;
}
if(step>=16)return;
bsp(number,step+1,flip);
bsp(number^flips[step],step+1,flip+1);
}
int main()
{
int i=0;
unsigned short int num=0;
char x;
while(i<16)
{
cin>>x;
if(x=='b')
num+=poww2(15-i);
i++;
}
min1=16;
bsp(num,0,0);
if(min1==16)
printf("Impossible/n");
else printf("%d/n",min1);
return 0;
}
/* POJ 1753 Flip Game (递归枚举) */
#include <stdio.h>
#include <stdlib.h>
//所有都是白的,或者所有都是黑的
int all_white_or_black(int* bits, int len)
{
int i = 0;
for (i = 0; i < len - 1; i++)
if (bits[i] != bits[i + 1])
return 0;
return 1;
}
//改变一个格子的颜色,并根据其所在位置改变其周围格子的颜色
void change_color(int* arr, int i)
{
arr[i] = !(arr[i]);
int x = i/4;
int y = i%4;
if (y < 3)
arr[i + 1] = !(arr[i + 1]);
if (y > 0)
arr[i - 1] = !(arr[i - 1]);
if (x > 0)
arr[i - 4] = !(arr[i - 4]);
if (x < 3)
arr[i + 4] = !(arr[i + 4]);
}
//递归判断
void combine(int* arr, int len, int* result, int count, const int NUM, int* last)
{
int i;
for (i = len; i >= count; i--)
{
result[count - 1] = i - 1;
if (count > 1)
combine(arr, i - 1, result, count - 1, NUM, last);
else
{
int j = 0;
//在这里生成arr的副本
int* new_arr = (int*)malloc(sizeof(int)*16);
for (j = 0; j < 16; j++)
new_arr[j] = arr[j];
for (j = NUM - 1; j >=0; j--)
{
change_color(new_arr, result[j]);
}
if (all_white_or_black(new_arr, 16))
{
*last = NUM;
free(new_arr);
break;
}
free(new_arr);
}
}
}
int main()
{
char str[5];
int bits[16];
int count = 15;
int lines = 4;
while (lines--)
{
scanf("%s", str);
int i;
for (i = 0; i < 4; i++)
{
if (str[i] == 'b')
bits[count--] = 1;
else
bits[count--] = 0;
}
}
if (all_white_or_black(bits, 16))
printf("%d\n", 0);
else
{ //生成bits数组的副本
int* new_bits = (int*)malloc(sizeof(int)*16);
int i;
for (i = 0; i < 16; i++)
new_bits[i] = bits[i];
int j;
//这里last用来接受combine函数里面的NUM,即需要的步数
int last = 0;
for (j = 1; j <= 16; j++)
{
int* result = (int*)malloc(sizeof(int)*j);
combine(new_bits, 16, result, j, j, &last);
if (last == j)
{
printf("%d\n", last);
break;
}
//new_bits已被改变,所以要还原为bits
for (i = 0; i < 16; i++)
new_bits[i] = bits[i];
free(result);
}
free(new_bits);
if (j == 17)
printf("Impossible\n");
}
return 0;
}