1. /*
  2. 题目描述
  3. 有9盏灯与9个开关,编号都是1~9。
  4. 每个开关能控制若干盏灯,按下一次会改变其控制的灯的状态(亮的变成不亮,不亮变成亮的)。
  5. 具体如下:
  6. 第一个开关控制第二,第四盏灯;
  7. 第二个开关控制第一,第三,第五盏灯;
  8. 第三个开关控制第二,第六盏灯;
  9. 第四个开关控制第一,第五,第七盏灯;
  10. 第五个开关控制第二,第四,第六,第八盏灯;
  11. 第六个开关控制第三,第五,第九盏灯;
  12. 第七个开关控制第四,第八盏灯;
  13. 第八个开关控制第五,第七,第九盏灯;
  14. 第九个开关控制第六,第八盏灯。
  15. 开始时所有灯都是熄灭的,开关是关闭着的。要求按下若干开关后,使得只有4盏灯亮着。
  16. 输入
  17. 输出
  18. 输出所有可能的方案,每行一个方案,每一行有9个字符,从左往右第i个字符表示第i个开关的状态(" 0" 表示关闭," 1" 表示打开),按字典序输出。下面的样例输出只是部分方案。
  19. 样例输入
  20. 样例输出
  21. 000001011
  22. 000001110
  23. 000001111
  24. */
  25. /*
  26. 重点:
  27. 思路:
  28. dfs 按位深搜
  29. */
  30. #include<iostream>
  31. using namespace std;
  32. int a[10]; // 记录每个按钮的状态
  33. int light[10]; // 记录灯的开关 状态
  34. void f(int i){
  35. //修改第 i 栈灯的状态
  36. if(light[i] == 0) light[i] = 1;
  37. else light[i] = 0;
  38. }
  39. bool check(){
  40. int cnt = 0;
  41. for(int i = 1;i <= 9;++i )
  42. if(light[i])
  43. ++cnt;
  44. if(cnt == 4) return true;
  45. else return false;
  46. }
  47. void dfs(int s){
  48. // 当前走到第 s 栈灯
  49. //判断终点
  50. if(s == 10){
  51. if(check()){
  52. for(int i = 1;i <= 9;++i)
  53. cout<<a[i];
  54. cout<<endl;
  55. }
  56. return ;
  57. }
  58. // 对所有可走点 dfs
  59. if(s == 1){
  60. // 0 状态,什么也不做
  61. a[s] = 0;
  62. dfs(s+1);
  63. // 1
  64. a[s] = 1;
  65. f(2);
  66. f(4);
  67. dfs(s+1);
  68. // 状态恢复
  69. f(2);
  70. f(4);
  71. }
  72. else if(s == 2){
  73. // 0
  74. a[s] = 0;
  75. dfs(s+1);
  76. // 1
  77. a[s] = 1;
  78. f(1);
  79. f(3);
  80. f(5);
  81. dfs(s+1);
  82. // 状态恢复
  83. f(1);
  84. f(3);
  85. f(5);
  86. }
  87. else if(s == 3){
  88. // 0
  89. a[s] = 0;
  90. dfs(s+1);
  91. // 1
  92. a[s] = 1;
  93. f(2);
  94. f(6);
  95. dfs(s+1);
  96. // 状态恢复
  97. f(2);
  98. f(6);
  99. }
  100. else if(s == 4){
  101. // 0
  102. a[s] = 0;
  103. dfs(s+1);
  104. // 1
  105. a[s] = 1;
  106. f(1);
  107. f(5);
  108. f(7);
  109. dfs(s+1);
  110. // 状态恢复
  111. f(1);
  112. f(5);
  113. f(7);
  114. }
  115. else if(s == 5){
  116. // 0
  117. a[s] = 0;
  118. dfs(s+1);
  119. // 1
  120. a[s] = 1;
  121. f(2);
  122. f(4);
  123. f(6);
  124. f(8);
  125. dfs(s+1);
  126. // 状态恢复
  127. f(2);
  128. f(4);
  129. f(6);
  130. f(8);
  131. }
  132. else if(s == 6){
  133. // 0
  134. a[s] = 0;
  135. dfs(s+1);
  136. // 1
  137. a[s] = 1;
  138. f(3);
  139. f(5);
  140. f(9);
  141. dfs(s+1);
  142. // 状态恢复
  143. f(3);
  144. f(5);
  145. f(9);
  146. }
  147. else if(s == 7){
  148. // 0
  149. a[s] = 0;
  150. dfs(s+1);
  151. // 1
  152. a[s] = 1;
  153. f(4);
  154. f(8);
  155. dfs(s+1);
  156. // 状态恢复
  157. f(4);
  158. f(8);
  159. }
  160. else if(s == 8){
  161. // 0
  162. a[s] = 0;
  163. dfs(s+1);
  164. // 1
  165. a[s] = 1;
  166. f(5);
  167. f(7);
  168. f(9);
  169. dfs(s+1);
  170. // 状态恢复
  171. f(5);
  172. f(7);
  173. f(9);
  174. }
  175. else if(s == 9){
  176. // 0
  177. a[s] = 0;
  178. dfs(s+1);
  179. // 1
  180. a[s] = 1;
  181. f(6);
  182. f(8);
  183. dfs(s+1);
  184. // 状态恢复
  185. f(6);
  186. f(8);
  187. }
  188. }
  189. int main(){
  190. dfs(1);
  191. return 0;
  192. }
点赞(0)
 

7.5 分

4 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论