标签:
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 }
标签:
原文地址:http://www.cnblogs.com/lsj2020/p/5731463.html