题目内容:
编程:甲、乙、丙三位球迷分别预测已进入半决赛的四支球队的名次如下:
甲预测:A队第1名,B队第2名;
乙预测:C队第1名,D队第3名;
丙预测:D队第2名,A队第3名。
比赛结果证实,甲、乙、丙预测各对一半。
试求A、B、C、D四队的名次(没有名次相同的情况)。
提示:本题的编程序方法可采用典型的枚举法,即“循环+选择”编程定式。可设变量a代表A队的名次,变量b代表B队的名次,变量c代表C队的名次,变量d代表D队的名次。变量a、b、c、d的取值范围都是1~4。这样就可以用四重循环结构得到四队不同名次的所有组合,对每个组合再来判断是否满足甲、乙、丙三人的预测,如果满足,则是问题的解。
进一步提示:判断条件的写法,以甲预测为例,A队第1名可表示a==1,B队第2名可表示为b==2,预测对一半可表示为(a==1)!=(b==2),或者((a == 1) + (b == 2) == 1),其它类同。
程序优化:也可采用三重循环结构,因为a、b、c、d之和是10,当a、b、c的取值确定以后,d的取值就确定了,即d=10-a-b-c。
采用这种枚举法编程的题目还有很多,如百元百鸡问题、韩信点兵问题以及数字组合问题等。
输入格式:
无
输出格式:
A=%d,B=%d,C=%d,D=%d
输入样例:
无
输出样例:
(恕不给出)
时间限制:500ms内存限制:32000kb
#include <stdio.h>
int main()
{
int x,y,z;
int i,j,k,m;
int a,b,c,d;
a=0;b=0;c=0;d=0;
for(i=1;a<=4;i++)
{
a++;
b=0;
for(j=1;b<=4;j++)
{
b++;
if(b==a)
b++;
c=0;
for(k=1;c<=4;k++)
{
c++;
if(c==a)
c++ ;
if(c==b)
c++;
d=0;
for(m=1;d<=4;m++ )
{
d++;
if(d==a)
d++;
if(d==b)
d++;
if(d==c)
d++;
x=((a==1)&&(!(b==2)))||((!(a==1))&&(b==2));
y=((c==1)&&(!(d==3)))||((!(c==1))&&(d==3));
z=((d==2)&&(!(a==3)))||((!(d==2))&&(a==3));
if(((x+y+z)==3)&&(a<5)&&(b<5)&&(c<5)&&(d<5)&&(a!=b)&&(a!=c)&&(a!=d)&&(b!=c)&&(b!=d)&&(c!=d))
printf("A=%d,B=%d,C=%d,D=%d\n",a,b,c,d);
}
}
}
}
}