张、王、李三家各有三个小孩。一天,三家的九个孩子在一起比赛短跑,规定不分年龄大小,跑第一得 9 分,跑第二得 8 分,依次类推。比赛结果显示各家的总分相同,且这些孩子没有同时到达终点的,也没有一家的两个或三个孩子获得相连的名次。已知获第一名的是李家的孩子,获第二名的是王家的孩子。获得最后一名的是谁家的孩子?

算法思想:
按题目的条件,共有 1+2+3+…+9=45 分,每家孩子的得分应为 15 分。根据题意可知,获第一名的是李家的孩子,获第二名的是王家的孩子,则可推出:获第三名的一定是张家的孩子。由“这些孩子没有同时到达终点的”可知:名次不能并列,由“没有一家的两个或三个孩子获得相连的名次”可知:第四名不能是张家的孩子。

#include <stdio.h>

int score[4][4];

int main(void) {
    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 开始,但不要超过行、列的范围。