原题链接:C语言训练-委派任务*
解题思路
0代表不去,1代表去,2代表未知,读题可知,这是逻辑题。虽然用6层循环可以暴力破解,但是不够炫酷。(这如何体现数学之美呢)。用不等式表示为
a + b >= 1
a + d != 2
a + e + f =2
b = c
c + d =1
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代表强关联
// -> E(判断)
// D -> C (force) -> B (force)(判断)
// -> A -> B(判断)
// -> E(判断), F
可用D-C-B线推出3个确定值,再根据弱关联的条件去判断,其中,第一层的E和第二层的E可用作判断,第二层由C推出的B和由A推出的B也可以作为判断,但是这里只用了B,因为推E,F这层计算多。
注意事项
只考虑了一种输出,因为本题是唯一解法,没有考虑存在多种解的可能。改进方向在于,如果有值出现2,表示已有的约束条件不能求出此值,该值是0 或1 都可以,有2个方法,那个输出的时候应该考虑输出2次的方案。
参考代码
#include <stdio.h>
int main (int argc, char *argv[])
{
int a =2, b=2, c=2, d=2, e=2, f=2; //0 not go, 1 go, 2 unkown
// -> E
// D -> C (force) -> B (force)
// -> A -> B
// -> E, F
for (d=1;d>=0;d--){
c=1-d;
//b=c; 之后用作判断
if (d==0) e=0;
if (d==1) a=0;//a+d!=2
if (e==0) a=1,f=1;
if (a==0) b=1; // 用于判断
if (b==c)break;
}
if(a==1)printf("A,");
if(b==1)printf("B,");
if(c==1)printf("C,");
if(d==1)printf("D,");
if(e==1)printf("E,");
if(f==1)printf("F,");
return 0;
}
8 分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复