1. 程式人生 > >《C語言及程式設計》實踐參考——誰是小偷

《C語言及程式設計》實踐參考——誰是小偷

【專案8-誰是小偷】
警察局抓住了A、B、C、D四名盜竊嫌疑犯,其中只有一人是小偷。在審問時,A說:“我不是小偷”;B說:“C是小偷”;C說:“小偷肯定是D”;D說:“C在冤枉好人”。現在已經知道這四人中有三人說的是真話,一人說的是假話。請問到底誰是小偷?
提示:設4個變數a,b,c,d,為0時表示不是小偷,為1時表示是小偷,用四重迴圈窮舉a,b,c,d可能的取值的組合,對每一種組合判斷其是否符合題目中給出的約束。最後結論:C是小偷。
[參考解答]
#include <stdio.h>
int main()
{
   int a,b,c,d;
    for(a=1;a>=0;a--) //窮舉每個人是否是小偷的所有情況
        for(b=1;b>=0;b--) //1:是小偷 0:不是
            for(c=1;c>=0;c--)
                for(d=1;d>=0;d--)
                    if((a==0)+(c==1)+(d==1)+(d==0)==3&&a+b+c+d==1) //4人的說法中有3個真的,且只有一個小偷
                    {
                        printf("A: %d, B: %d, C: %d, D: %d\n", a, b, c, d);
                    }
    return 0;
}

下面一個程式的寫法中,注意“4人的說法中有3個真的”(即if語句部分)的寫法。
例:從下表可以看出,a==0及a!=1的值,完全等價於!a,這樣的寫法在C語言程式中大量使用。而c==1這樣的表示式,完全可以用c代替。

a

!a

a==0

a!=1

0

1

1

1

1

0

0

0


於是有:
#include <stdio.h>
int main()
{
    int a,b,c,d;
    for(a=1; a>=0; a--) //窮舉每個人是否是小偷的所有情況
        for(b=1; b>=0; b--) //1:是小偷 0:不是
            for(c=1; c>=0; c--)
                for(d=1; d>=0; d--)
                    if((!a)+(c)+(d)+(!d)==3&&a+b+c+d==1) //!a與a==0或a!=1完全等價,其他同
                    {
                        printf("A: %d, B: %d, C: %d, D: %d\n", a, b, c, d);
                    }
    return 0;
}