poj1753

来源:互联网 发布:ip网络座机怎样使用 编辑:程序博客网 时间:2024/04/29 17:57
转自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;elsebits[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;}

0 0