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