解题思路

0代表不去,1代表去,2代表未知,读题可知,这是逻辑题。虽然用6层循环可以暴力破解,但是不够炫酷。(这如何体现数学之美呢)。用不等式表示为

  1. a + b >= 1
  2. a + d != 2
  3. a + e + f =2
  4. b = c
  5. c + d =1
  6. if (d=0)e=0

可以发现第四第五个条件为强关联条件,1,2,3为弱关联。就是说d=0,则c=1,b=1,d=1,则c=0,b=0。e 在d=1的情况下未知。a在d=0的情况下未知,但是d=1,则a=1。用图表示为一下样子,force代表强关联

  1. // -> E(判断)
  2. // D -> C (force) -> B (force)(判断)
  3. // -> A -> B(判断)
  4. // -> E(判断), F

可用D-C-B线推出3个确定值,再根据弱关联的条件去判断,其中,第一层的E和第二层的E可用作判断,第二层由C推出的B和由A推出的B也可以作为判断,但是这里只用了B,因为推E,F这层计算多。

注意事项

只考虑了一种输出,因为本题是唯一解法,没有考虑存在多种解的可能。改进方向在于,如果有值出现2,表示已有的约束条件不能求出此值,该值是0 或1 都可以,有2个方法,那个输出的时候应该考虑输出2次的方案。

参考代码

  1. #include <stdio.h>
  2. int main (int argc, char *argv[])
  3. {
  4. int a =2, b=2, c=2, d=2, e=2, f=2; //0 not go, 1 go, 2 unkown
  5. // -> E
  6. // D -> C (force) -> B (force)
  7. // -> A -> B
  8. // -> E, F
  9. for (d=1;d>=0;d--){
  10. c=1-d;
  11. //b=c; 之后用作判断
  12. if (d==0) e=0;
  13. if (d==1) a=0;//a+d!=2
  14. if (e==0) a=1,f=1;
  15. if (a==0) b=1; // 用于判断
  16. if (b==c)break;
  17. }
  18. if(a==1)printf("A,");
  19. if(b==1)printf("B,");
  20. if(c==1)printf("C,");
  21. if(d==1)printf("D,");
  22. if(e==1)printf("E,");
  23. if(f==1)printf("F,");
  24. return 0;
  25. }
点赞(0)
 

8 分

4 人评分

 

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

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

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

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

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

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

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

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

评论列表 共有 1 条评论

小灯 2年前 回复TA
有点小错,第一个代码框下面:“d=1,则a=1”错了,应该是d=1,a=0。