打印本文 打印本文  关闭窗口 关闭窗口  
C趣味程序百例(17)谁家孩子跑最慢
作者:佚名  文章来源:不详  点击数  更新时间:2008/4/18 13:59:08  文章录入:杜斌  责任编辑:杜斌

57.谁家孩子跑最慢
    张王李三家各有三个小孩。一天,三家的九个孩子在一起比赛短跑,规定不分年龄大小,跑第一得9分,跑第2得8分,依此类推。比赛结果各家的总分相同,且这些孩子没有同时到达终点的,也没有一家的两个或三个孩子获得相连的名次。已知获第一名的是李家的孩子,获得第二的是王家的孩子。问获得最后一名的是谁家的孩子?
*问题分析与算法设计
    按题目的条件,共有1+2+3+...+9=45分,每家的孩子的得分应为15分。根据题意可知:获第一名的是李家的孩子,获第二名的是王家的孩子,则可推出:获第三名的一定是张家的孩子。由“这些孩子没有同时到达终点的”可知:名次不能并列,由“没有一家的两个或三个孩子获得相连的名次”可知:第四名不能是张家的孩子。
    程序中为了方便起见,直接用分数表示。
*程序与程序注释
#include<stdio.h>
int score[4][4];
void main()
{
    int i,j,k,who;
    score[1][1]=7;     /*按已知条件进行初始化:score[1]:张家三个孩子的得分*/ 
    score[2][1]=8;                 /*score[2]:王家三个孩子的得分*/
    score[3][1]=9;                 /*李家三个孩子的得分*/
    for(i=4;i<6;i++)               /*i:张家孩子在4到6分段可能的分数*/
        for(j=4;j<7;j++)           /*j:王家孩子在4到6分段可能的分数*/
            for(k=4;i!=j&&k<7;k++) /*k:李家孩子在4到6分段可能的分数*/
                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("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");
}
*运行结果
    7   5   3
    8   6   1
    9   4   2
    The last one arrived to end is a child from family Wang.
    (获得最后一名的是王家的孩子。
打印本文 打印本文  关闭窗口 关闭窗口