打牌不说真话

三个人一起玩牌,玩到一半的时候统计各自手里的剩牌张数。小王说:“我还剩12张,比小李少2张,比小张多1张。”小李说:“我剩的张数在三个人中不是最少的,小张和我相差了3张,他剩了15张。”小张说:“我剩的张数比小王少,小王剩了13张,小李剩了11张。”如果三个人每个人说的三句话中只有两句是正确的,

请问他们分别剩了多少张呢?

我们通过假设每个人的某句话为假,结合“每人三句话中两句真一句假”来推理。因不超过54张牌,推断小王<=17,小李<=28,小张<=30

 

int check_wang(int w, int l, int z) {

    int a = (w == 12); 

    int b = (l == w + 2); 

    int c = (z == w - 1); 

    return (a + b + c) == 2; 

}

int check_li(int w, int l, int z) {

    int a = (l > z || l > w); 

    int b = (l - z == 3 || z - l == 3); 

    int c = (z == 15); 

    return (a + b + c) == 2;

}

int check_zhang(int w, int l, int z) {

    int a = (z < w); 

    int b = (w == 13); 

    int c = (l == 11); 

    return (a + b + c) == 2;

}

int main() {

    int wang, li, zhang;

    for (wang = 1; wang <= 17; wang++) {

        for (li = 1; li <= 28; li++) {

            for (zhang = 1; zhang <= 30; zhang++) {

                if (check_king(wang, li, zhang) &&

                        check_li(wang, li, zhang) &&

                        check_zhang(wang, li, zhang)) {                  printf("小王剩%d张,小李剩%d张,小张剩%d张\n", wang, li, zhang);

                    }

            }

        }

    }

 

 

你可能感兴趣的:(c语言,c++)