一、题目:
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
二、思路:
既然有五个人,那么就用一个数组定义五个变量。
p0=a;p1=b;p2=c;p3=d;p4=e
每个人都可能是1,2,3,4,5名,所以每人用个for循环
每人说的话都有一半正确,则无论哪一半是对的,对的加上错的都是一,我们可以用这个来作为条件语句。
再加上是所有选手的话都必须同时满足,所以,每位选手之间通过&&来连接。最后,还要保证几个人不会争一个名次,即不会是相同的名次。
三、代码实现
#include<stdio.h>
#include<Windows.h>
int repeat1(int *p)
{
int temp[7] = { 0 };
int i;
for (i = 0; i < 5; i++)
{
if (temp[p[i]])
{
return 0;
}
temp[p[i]] = 1;
}
return 1;
}
int repeat(int *p)
{
char tmp = 0;
for (int i = 0; i < 5; i++)
{
tmp |= 1 << p[i];
}
return tmp == 0x3E;
}
int main()
{
int p[5] = { 0 };
for (p[0] = 1; p[0] <= 5; p[0]++)
{
for (p[1] = 1; p[1] <= 5; p[1]++)
{
for (p[2] = 1; p[2] <= 5; p[2]++)
{
for (p[3] = 1; p[3] <= 5; p[3]++)
{
for (p[4] = 1; p[4] <= 5; p[4]++)
{
if ((p[1] == 2) + (p[0] == 3) ==1 &&
(p[1] == 2) +( p[4] == 4) ==1&&
(p[2] == 1) +( p[3] == 2) ==1&&
(p[2] == 5) +( p[3] == 3) ==1&&
(p[4] == 4) +( p[0] == 1) ==1&&
repeat(p))//两种防止重复的方法 repeat & repeat1
for (int i = 0; i < 5; i++)
{
printf("%d", p[i]);
}
}
}
}
}
}
printf("\n");
system("pause");
return 0;
}