张、王、李三家各有三个小孩。一天,三家的九个孩子在一起比赛短跑,规定不分年龄大小,跑第一得 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 开始,但不要超过行、列的范围。