当前位置:   article > 正文

poj 1753 filp game 2015年暑假训练第一题 枚举

poj 1753 filp game 2015年暑假训练第一题 枚举

题意就是说:翻牌,随便翻到一张牌,其上下左右随他都得翻,看最少用翻几张牌,能够让16张牌全为正或全为负。

这道题有一个大坑,就是每一张牌其实只能翻奇数次,比如翻的顺序为 (3,2)->   (2,2)  ->  (3,2)   = =   (2,2)  是  等价的

故最多翻的个数是16,从0到16一个一个测试,枚举的是翻牌的个数,若全为正或反,则断开枚举,否则一直枚举

最多有C(0,16)+C(1,16)+。。。+C(16,16)=2^16次,

这道题首先是用dfs码的,但是最麻烦的情况下会超时吧,比如Impossible;//不会改,我只是一名小牛

后来用枚举翻牌个数打的,期间遇到很多问题;

1:二维变一维,在翻牌时要注意关联牌的翻转;

2:一般组合代码的实现,即16个牌中抽n个牌的代码n>=0,n<=16;

3:  翻牌后若不为全,还得翻回来;//其实可以把实参数组传递给形参解决;



一般组合组合的代码如下:省略打的

  1. int n,m;
  2. cin>>n>>m;
  3. int rcd[10];
  4. int num[10];
  5. void select_combination(int l,int p)
  6. {
  7. int i;
  8. if(l==m)
  9. {
  10. for(i=0;i<m;i++)
  11. {
  12. cout<<rcd[i];
  13. if(i<m-1)
  14. cout<<' ';
  15. }
  16. cout<<endl;
  17. return ;
  18. }
  19. for(i=p;i<n;i++)
  20. {
  21. rcd[l]=num[i];
  22. select_combination(int l+1,int i+1)
  23. }
  24. }
  25. int mian()
  26. {
  27. select_combination(0,0);
  28. return 0;
  29. }

下面是我打的代码:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<queue>
  4. using namespace std;
  5. char a[5][5];//二维
  6. char own[30];//一维
  7. int add[6]= {0,4,-4,1,-1};//翻转区域
  8. //queue<int> s;
  9. int num[30];
  10. int point;//
  11. int k=0;
  12. int n=16;
  13. int find()//发现是否出现全为0或全为1
  14. {
  15. int i;
  16. int k1=1,k2=1;
  17. for(i=0; i<16; i++) //判断是否全为黑色
  18. {
  19. if(own[i]=='0')//有白色
  20. {
  21. k1=0;
  22. }
  23. if(own[i]=='1')//有黑色
  24. {
  25. k2=0;
  26. }
  27. }
  28. if(k1==0&&k2==0)//既有白,又有黑
  29. {
  30. return -1;
  31. }
  32. else
  33. return 0;//全
  34. }
  35. int tell(int i)//判断是否出界
  36. {
  37. if(i<0||i>=16)
  38. return 0;
  39. else
  40. return 1;
  41. }
  42. void fanzhuan(int k)//进行翻转
  43. {
  44. int p;
  45. int i;
  46. for(i=0; i<3; i++)
  47. {
  48. p=k+add[i];
  49. if(tell(p)==1)
  50. {
  51. if(own[p]=='1')
  52. own[p]='0';
  53. else
  54. own[p]='1';
  55. }
  56. }
  57. int x=k%4;
  58. if(x==0)
  59. {
  60. p=k+1;
  61. if(tell(p)==1)
  62. {
  63. if(own[p]=='1')
  64. own[p]='0';
  65. else
  66. own[p]='1';
  67. }
  68. }
  69. else if(x==3)
  70. {
  71. p=k-1;
  72. if(tell(p)==1)
  73. {
  74. if(own[p]=='1')
  75. own[p]='0';
  76. else
  77. own[p]='1';
  78. }
  79. }
  80. else
  81. {
  82. for(i=3;i<5;i++)
  83. {
  84. p=k+add[i];
  85. if(tell(p)==1)
  86. {
  87. if(own[p]=='1')
  88. own[p]='0';
  89. else
  90. own[p]='1';
  91. }
  92. }
  93. }
  94. }
  95. int panduan()
  96. {
  97. int i,j;
  98. for(i=0; i<point; i++)
  99. {
  100. int p=num[i];
  101. fanzhuan(num[i]);
  102. }
  103. if(find()==0)//全
  104. return 1;
  105. else
  106. return 0;
  107. }
  108. void select_com(int l,int p)
  109. {
  110. int i;
  111. if(l==point)
  112. {
  113. int g=panduan();
  114. if(g==1)
  115. {
  116. k=1;
  117. cout<<point<<endl;
  118. return ;
  119. }
  120. else
  121. {
  122. int t=panduan();
  123. }
  124. }
  125. for(i=p; i<n; i++)
  126. {
  127. if(k==0)
  128. {
  129. num[l]=i;
  130. select_com(l+1,i+1);
  131. }
  132. }
  133. }
  134. int main()
  135. {
  136. while(cin>>a[0][0])
  137. {
  138. int i,j;
  139. int start=0;
  140. for(i=1; i<=3; i++)
  141. {
  142. cin>>a[0][i];
  143. }
  144. for(i=0; i<4; i++)
  145. {
  146. if(a[0][i]=='b')
  147. a[0][i]='1';
  148. else
  149. a[0][i]='0';
  150. own[start++]=a[0][i];
  151. }
  152. for(i=1; i<=3; i++)
  153. {
  154. for(j=0; j<4; j++)
  155. {
  156. cin>>a[i][j];
  157. if(a[i][j]=='b')//黑色
  158. a[i][j]='1';
  159. else//白色
  160. a[i][j]='0';
  161. own[start++]=a[i][j];//二维变一维
  162. }
  163. }
  164. int m=1;
  165. if(find()==0)
  166. cout<<0<<endl;
  167. else//枚举翻转个数m
  168. {
  169. while(m<16)
  170. {
  171. point=m;
  172. select_com(0,0);
  173. if(k==1)
  174. break;
  175. m++;
  176. }
  177. if(k==0)
  178. cout<<"Impossible"<<endl;
  179. }
  180. k=0;
  181. }
  182. return 0;
  183. }

测试案例如下:
代码已AC

bwbw
wwww
bbwb
bwwb
Impossible

bwwb
bbwb
bwwb
bwww
4

wwww
wwww
wwww
wwww
0

bbbb
bbbb
bbbb
bbbb
0

bbbb
bwbb
bbbb
bbbb
Impossible

bwbb
bwbb
bwbb
bbbb
Impossible

bwbb
wwwb
bwbb
bbbb
1

wwww
wwwb
wwbb
wwwb
1

wwww
wwww
wwwb
wwbb
1

wbwb
bwbw
wbwb
bwbw
Impossible

bbbb
bwwb
bwwb
bbbb
4

bwwb
wbbw
wbbw
bwwb
4

bbww
bbww
wwbb
wwbb
Impossible

bbwb
bbbw
wwbb
wwwb
Impossible

wwwb
wwbw
wbww
wwbw
Impossible

bbbb
wwww
wwbb
wbbb
Impossible

bwwb
wbwb
wbbb
wbbb
4

bwbb
bwbb
bwbw
bbbw
5

wbwb
bbbb
bbww
wbbb
6

bbwb
bbbb
wbwb
bbbb
5






声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/186482
推荐阅读
相关标签
  

闽ICP备14008679号