解题思路:因为获第一名的是李家的孩子,获得第二的是王家的孩子,又因为没有一家的两个或三个孩子获得相连的名次,所以推断第三名一定是张家的孩子,采用穷举法,a,b,c为张家的孩子,d,e,f为李家的孩子,g,h,i为王家的孩子,所有的方法都遍历一遍,定义一个数组,ab数组元素都为1,ab[i](0<=i<=9)值为1时表示数i没有被使用,为0时表示数i已被使用。
注意事项:
参考代码:
//张王李三家各有三个小孩。
//一天,三家的九个孩子在一起比赛短跑,规定不分年龄大小,
//跑第一得9分,跑第2得8分,依此类推。比赛结果各家的总分相同,
//且这些孩子没有同时到达终点的,也没有一家的两个或三个孩子获得相连的名次。
//已知获第一名的是李家的孩子,获得第二的是王家的孩子。
//问获得最后一名的是谁家的孩子?
int a,b,c,d,e,f,g,h,i,k;
int ab[10] = {1,1,1,1,1,1,1,1,1,1};//数组赋初值
int x[9];
//a,b,c为张家的孩子,d,e,f为李家的孩子,g,h,i为王家的孩子
for(a=1;a<8;a++)
{
ab[a] = 0;//表示不能再让其他变量取与a相同的值
for(b=1;b<8;b++)
if(ab[b])//如果b取得当前值没有和其他变量重复
{
ab[b] = 0;//表示不能再让其他变量取与b相同的值
for(c=1;c<8;c++)
if(ab[c])//如果c取得当前值没有和其他变量重复
{
ab[c] = 0;//表示不能再让其他变量取与c相同的值
for(d=1;d<10;d++)
if(ab[d]){//如果d取得当前值没有和其他变量重复
ab[d] = 0;//表示不能再让其他变量取与d相同的值
for(e=1;e<10;e++)
if(ab[e]){//如果e取得当前值没有和其他变量重复
ab[e] = 0;//表示不能再让其他变量取与e相同的值
for(f=1;f<10;f++)
if(ab[f]){//如果f取得当前值没有和其他变量重复
ab[f] = 0;//表示不能再让其他变量取与f相同的值
for(g=1;g<9;g++)
if(ab[g]){//如果g取得当前值没有和其他变量重复
ab[g] = 0;//表示不能再让其他变量取与g相同的值
for(h=1;h<9;h++)
if(ab[h]){//如果h取得当前值没有和其他变量重复
ab[h] = 0;//表示不能再让其他变量取与h相同的值
for(i=1;i<9;i++)
if(ab[i]){//如果i取得当前值没有和其他变量重复
ab[i] = 0;//表示不能再让其他变量取与i相同的值
if(a+b+c==d+e+f && d+e+f==g+h+i)//每家孩子的总分相等
if(d == 9 || e == 9 || f == 9)//第一名为李家的孩子
if(g == 8 || h == 8 || i == 8)//第二名为王家的孩子
if(a == 7 || b == 7 || c == 7)//所以第三名为张家的孩子
if(a!=b+1 && a!=b-1 && a!=c+1 && a!=c-1 && b!=c+1 && b!=c-1 && d!=e+1 && d!=e-1 && d!=f+1 && d!=f-1 && e!=f+1 && e!=f-1 && g!=h+1 && g!=h-1 && g!=i+1 && g!=i-1 && h!=i+1 && h!=i-1)
{//没有一家的两个或三个孩子获得相连的名次
//printf("%d %d %d %d %d %d %d %d %d\n",a,b,c,d,e,f,g,h,i);
x[0] = a;
x[1] = b;
x[2] = c;
x[3] = d;
x[4] = e;
x[5] = f;
x[6] = g;
x[7] = h;
x[8] = i;
//结果输入数组中
break;
}
ab[i]= 1;//本次循环没有找到解,让i取其他值
}
ab[h]= 1;//本次循环没有找到解,让h取其他值
}
ab[g]= 1;//本次循环没有找到解,让g取其他值
}
ab[f]= 1;//本次循环没有找到解,让f取其他值
}
ab[e]= 1;//本次循环没有找到解,让e取其他值
}
ab[d]= 1;//本次循环没有找到解,让d取其他值
}
ab[c]= 1;//本次循环没有找到解,让c取其他值
}
ab[b]= 1;//本次循环没有找到解,让b取其他值
}
ab[a]= 1;//本次循环没有找到解,让a取其他值
}
for(k = 0;k < 9;k++)//穷举法查找数字1
{
if(1 == x[k])//找到后退出循环
break;
}
//发现:找到后立刻退出循环,那么k就是我们要找的数字1的下标
if(k == 0 || k == 1 || k == 2)//下标为0,1,2是张家
printf("Z");
else if(k == 3 || k == 4 || k == 5)//下标为3,4,5是李家
printf("L");
else//(k == 0 || k == 1 || k == 2)//否则是王家
printf("W");
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复