C語言誰家孩子跑得最慢

2020-07-16 10:04:31
張、王、李三家各有三個小孩。一天,三家的九個孩子在一起比賽短跑,規定不分年齡大小,跑第一得 9 分,跑第二得 8 分,依次類推。比賽結果顯示各家的總分相同,且這些孩子沒有同時到達終點的,也沒有一家的兩個或三個孩子獲得相連的名次。已知獲第一名的是李家的孩子,獲第二名的是王家的孩子。獲得最後一名的是誰家的孩子?

演算法思想

按題目的條件,共有 1+2+3+…+9=45 分,每家孩子的得分應為 15 分。根據題意可知,獲第一名的是李家的孩子,獲第二名的是王家的孩子,則可推出:獲第三名的一定是張家的孩子。由“這些孩子沒有同時到達終點的”可知:名次不能並列,由“沒有一家的兩個或三個孩子獲得相連的名次”可知:第四名不能是張家的孩子。

程式程式碼

#include <stdio.h>
int score[4][4];
int main()
{
    int i,j,k,who;
    score[1][1]=7;
    score[2][1]=8;
    score[3][1]=9;
    for(i=4;i<6;i++)
        for(j=4;j<7;j++)
            for(k=4;i!=j&&k<7;k++)
                if(k!=i&&k!=j&&15-i-score[1][1]!=15-j-score[2][1]
                             &&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;
                    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)
                        printf("最後一名是張家孩子n");
                    else if(who==2)
                        printf("最後一名是王家孩子n");
                    else
                        printf("最後一名是李家孩子n");
                    return 0;
}

偵錯執行結果

根據演算法思想,通過程式的執行得到結果如下所示:

753
861
942
最後一名是王家孩子

總結

本範例主要運用了二維陣列的參照和迴圈的巢狀。二維陣列元素的參照形式為“陣列名[下標1][下標2]”。例如“a[1][2]”其下標是可以大於或者等於 0 的整型常數、整型變數或者整型表示式。

參照二維陣列元素時,下標不要越界,也就是說下標值需要從 0 開始,但不要超過行、列的範圍。