1 //POJ1753 枚举2016-7-31:2016-8-2
2
3 #include<stdio.h>
4 char copy[17][20];
5 void oneflip(char*rec,int i){
6 if(0<=i&&i<20&&i!=4&&i!=9&&i!=14&&i!=19){
7 if(rec[i]=='w') rec[i]='b';
8 else rec[i]='w';
9 }
10 }
11 void allflip(char*rec,int i){//全翻
12 oneflip(rec,i);
13 oneflip(rec,i+1);
14 oneflip(rec,i-1);
15 oneflip(rec,i+5);
16 oneflip(rec,i-5);
17 }
18 bool check(char* rec){
19 char a=rec[0];
20 for(int i=0;i<20;i++){
21 if(a!=rec[i]&&rec[i]!='\n')
22 return false;
23 }
24 return true;
25 }
26
27 bool func(char rec[],int start,int count){//枚举算法。这段是核心代码,递归不熟练,这段改了很久,觉得写的还是不清晰。
28 if(check(rec))
29 return true;
30 if(start+count>=20||count==0)
31 return false;
32 //拷贝数组
33 for(int i=0;i<20;i++){
34 copy[count][i]=rec[i];
35 }
36
37 for(int i=start;i<20;i++){
38 if(i==4||i==9||i==14||i==19)
39 continue;
40
41 allflip(rec,i);
42
43 /*printf("%d-------------------\n",count);//打印路径
44 for(int t=0;t<20;t++)
45 printf("%c",rec[t]);
46 */
47 if(count!=1&&i+1!=4&&i+1!=9&&i+1!=14&&i+1!=19){
48 if(func(rec,i+1,count-1))
49 return true;
50 }
51 else
52 if(func(rec,i+2,count-1))
53 return true;
54 }
55 //还原数组
56 for(int i=0;i<20;i++){
57 rec[i]=copy[count][i];
58 }
59
60 return false;
61 }
62
63 int main(){
64 int flag=0;
65 char rec[20]; //rec 4 9 14 19 as \n
66 for(int i=0;i<20;i++)
67 scanf("%c",&rec[i]);
68 int count=0;
69 for(int i=0;i<=16&&!flag;i++){
70 if(func(rec,0,i)){
71 printf("%d\n",i);
72 flag=1;
73 }
74 }
75 if(flag==0)
76 printf("Impossible\n");
77 return 0;
78 }