C趣味程序百例(17)誰家孩子跑最慢

字號:

57.誰家孩子跑最慢
     張王李三家各有三個小孩。一天,三家的九個孩子在一起比賽短跑,規(guī)定不分年齡大小,跑第一得9分,跑第2得8分,依此類推。比賽結(jié)果各家的總分相同,且這些孩子沒有同時到達(dá)終點的,也沒有一家的兩個或三個孩子獲得相連的名次。已知獲第一名的是李家的孩子,獲得第二的是王家的孩子。問獲得最后一名的是誰家的孩子?
    *問題分析與算法設(shè)計
     按題目的條件,共有1+2+3+...+9=45分,每家的孩子的得分應(yīng)為15分。根據(jù)題意可知:獲第一名的是李家的孩子,獲第二名的是王家的孩子,則可推出:獲第三名的一定是張家的孩子。由“這些孩子沒有同時到達(dá)終點的”可知:名次不能并列,由“沒有一家的兩個或三個孩子獲得相連的名次”可知:第四名不能是張家的孩子。
     程序中為了方便起見,直接用分?jǐn)?shù)表示。
    *程序與程序注釋
    #include
    int score[4][4];
    void main()
    {
     int i,j,k,who;
     score[1][1]=7; /*按已知條件進(jìn)行初始化:score[1]:張家三個孩子的得分*/
     score[2][1]=8; /*score[2]:王家三個孩子的得分*/
     score[3][1]=9; /*李家三個孩子的得分*/
     for(i=4;i<6;i++) /*i:張家孩子在4到6分段可能的分?jǐn)?shù)*/
     for(j=4;j<7;j++) /*j:王家孩子在4到6分段可能的分?jǐn)?shù)*/
     for(k=4;i!=j&&k<7;k++) /*k:李家孩子在4到6分段可能的分?jǐn)?shù)*/
     if(k!=i&&k!=j&&15-i-score[1][1]!=15-j-score[2][1] /*分?jǐn)?shù)不能并列*/
     &&15-i-score[1][1]!=15-k-score[3][1]
     &&15-j-score[2][1]!=15-k-score[3][1])
     {
     score[1][2]=i;score[1][3]=15-i-7; /*將滿足條件的結(jié)果記入數(shù)組*/
     score[2][2]=j;score[2][3]=15-j-8;
     score[3][2]=k;score[3][3]=15-k-9;
     }
     for(who=0,i=1;i<=3;i++,printf("\n"))
     for(j=1;j<=3;j++)
     {
     printf("%d",score[i][j]); /*輸出各家孩子的得分情況*/
     if(score[i][j]==1)who=i; /*記錄最后一名的家庭序號*/
     }
     if(who==1) /*輸出最后判斷的結(jié)果*/
     printf("The last one arrived to end is a child from family Zhang.\n");
     else if(who==2)
     printf("The last one arrived to end is a child from family Wang.\n");
     else printf("The last one arrived to end is a child from family Li.\n");
    }
    *運行結(jié)果
     7 5 3
     8 6 1
     9 4 2
     The last one arrived to end is a child from family Wang.
     (獲得最后一名的是王家的孩子。