转自http://www.cnblogs.com/shuaiwhu/archive/2012/04/27/2474041.html
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int all_white_black(int *bits,int len)
{
int i;
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,len-1,result,count-1,NUM,last);//注意是count-1
}else{
int j=0;
int *new_arr=(int *)malloc(sizeof(int)*16);
for(j=0;j<16;j++)
new_arr[j]=arr[j];
for(j=NUM;j>0;j--)
change_color(arr,result[j-1]);//这里应该是result【j-1】
if(all_white_black(new_arr,16)){
*last=NUM;
free(new_arr);
break;
}
free(new_arr);
}
}
}
int main(int argc, char *argv[]) {
char str[5];//包含'\n'
int bits[16];
int count=15;//注意count-1是数组
int line=4;
int i;
while(line--)
{
scanf("%s",str);
for(i=0;i<4;i++){
if(str[i]=='b')
bits[count--]=1;
else
bits[count--]=0;
}
}
/*for(i=0;i<16;i++)
printf("%d\n",bits[i]);*/
if(all_white_black(bits,16))
printf("%d\n",0);
else{
int* new_bits = (int*)malloc(sizeof(int)*16);
int i;
for (i = 0; i < 16; i++)
new_bits[i] = bits[i];
int j;
int last=0;
for(j=1;j<17;j++)
{
int *result=malloc(sizeof(int)*j);
combine(new_bits,16,result,j,j,&last);
if(last==j)
{
printf("%d\n",last);
break;
}
for (i = 0; i < 16; i++)
new_bits[i] = bits[i];
free(result);
}
free(new_bits);
if(j==17)
{
printf("Impossible\n");
}
}
return 0;
}