1. 程式人生 > >跳水比賽,根據選手所提供資訊,程式設計確定名次

跳水比賽,根據選手所提供資訊,程式設計確定名次

5位運動員參加了10米臺跳水比賽,有人讓他們預測比賽結果 A選手說:B第二,我第三; B選手說:我第二,E第四; C選手說:我第一,D第二; D選手說:C最後,我第三; E選手說:我第四,A第一; 比賽結束後,每位選手都說對了一半,請程式設計確定比賽的名次。

先來分析這五位選手的話,因為每位選手都只說對了一半,所以有以下幾種可能情況: 針對a選手所說: (b2&&a!=3) || ( b!=2&&a3) 針對b選手所說: (b2&&e!=4) || ( b!=2&&e4) 針對c選手所說: (c1&&d!=2) || ( c!=1&&d

2) 針對d選手所說: (c5&&d!=3) || ( c!=5&&d3) 針對e選手所說: (e4&&a!=1) || ( e!=4&&a1) 有了以上判斷,我們就可以通過一個迴圈來不斷地查找出符合該判斷的名次 #include<stdio.h> #include<stdlib.h> int main(){ int a=1; int b=1; int c=1; int d=1; int e=1; for(a=1;a<=5;a++){ for(b=1;b<=5;b++){ for(c=1;c<=5;c++){ for(d=1;d<=5;d++){ for(e=1;e<=5;e++){ /if((((b2)&&(a!=3))||((b!=2)&&(a
3))) &&(((b2)&&(e!=4))||((b!=2)&&(e4))) &&(((c1)&&(d!=2))||((c!=1)&&(d2))) &&(((c5)&&(d!=3))||((c!=5)&&(d3))) &&(((e4)&&(a!=1))||((e!=4)&&(a1))) ){ if(a
bcde==120){ printf(“a=%d,b=%d,c=%d,d=%d,e=%d”,a,b,c,d,e); } }
/ //上面的程式碼雖然是正確的,但是顯然看起來很複雜且不好寫,我們可以來想想是否存在一個簡單的方法 //比如說,就 (b2&&a!=3) || ( b!=2&&a3)來說,b2與a3中,肯定有一個是成立的,我們根據邏輯值來進行判斷,有一個為真,其邏輯值為1,那麼用(b2)+(a3)1來判斷,豈不是更能減少程式碼量 if( ((b2)+(a3)1) &&((b2)+(e4)1) &&((c1)+(d2)1) &&((c5)+(d3)1) &&((e4)+(a1)1) ){ //僅滿足了上列條件,就能保證求出來的結果是唯一值嗎,顯然通過測試是不能的,因為它沒有保證a,b,c,d,e這五者的值一定要不相同,比賽的名次肯定不能重複啊,所以還要再來一次判斷以確保這五者的名次不相同,因為一共5個人,5個名次,5,4,3,2,1,根據數學的一個常數的因式分解是固定的,所以會想到abcde120這個判斷條件。 if(abcde120){ printf(“a=%d,b=%d,c=%d,d=%d,e=%d”,a,b,c,d,e); } } } } } } } system(“pause”); return 0; }