POJ1753

 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 }

 

posted on 2016-08-03 09:00  SijingLin  阅读(211)  评论(0编辑  收藏  举报

导航