木子尚木木 发表于 2020-5-8 19:41:16

求大神指点

甲、乙、丙、丁四人参加一次数学竞赛。赛后,他们四人预测名次的谈话如下:
甲说:“丙得第一,我第三名”;
乙说:“我第一名,丁第四名”
丙说:“丁第二名,我第三名”
丁没说话。
当最后结果公布时,甲乙丙都只说对了一半,请给出正确的4人名次(没有并列名次)。
解题思路:
甲的名次是1,2,3,4中的一种,同理,乙,丙,丁也是如此。这样,可以用一个4重循环,把甲乙丙丁四人的名次做枚举。
不妨设甲乙丙丁的名次分别为a,b,c,d
“丙得第一,我第三名”;c==1 && a==3
都只说对了一半,则可表述为:(c==1)&&!(a==3) ||!(c==1)&&(a==3)
名次互不相同,a!=b && a!=c && a!=d && b!=c && b!=d && c!=d{:10_269:}{:10_269:}{:10_269:}

liuzhengyuan 发表于 2020-5-8 19:46:44

???
(c==1)&&!(a==3) ||!(c==1)&&(a==3)
!表示“反转”,也就是真变假,假变真

superbe 发表于 2020-5-8 22:11:17

#include <stdio.h>

int main()
{
    int a, b, c, d;

    for (a = 1; a <= 4; a++)
      for (b = 1; b <= 4; b++)
            for (c = 1; c <= 4; c++)
                for (d = 1; d <= 4; d++)
                {
                  if (((c == 1) && !(a == 3) || !(c == 1) && (a == 3)) &&
                        ((b == 1) && !(d == 4) || !(b == 1) && (d == 4)) &&
                        ((d == 2) && !(c == 3) || !(d == 2) && (c == 3)) &&
                        (a != b && a != c && a != d && b != c && b != d && c != d))
                        printf("甲%d, 乙%d, 丙%d, 丁%d\n", a, b, c, d);
                }

    return 0;


运行结果是:
甲3, 乙1, 丙4, 丁2
页: [1]
查看完整版本: 求大神指点