题目要求:
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
分析:
现在要让我们预测结果,比赛名次必须为连续的整数,比如1,2,3……,而不能出现不连续的整数,比如1,3,4,5……名次可以并列,则我们先罗列出所有可能出现的情况,然后排除不连续的整数即可。
我们可以这样实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
//a,b,c,d,e排序;
void PlayNo()
{
int a = 1;
int b = 1;
int c = 1;
int d = 1;
int e = 1;
unsigned int flag = 0;
for(a = 1; a <= 5; a++)
{
for(b = 1; b <= 5; b++)
{
flag = 0;
for(c = 1; c <= 5; c++)
{
for(d = 1; d <= 5; d++)
{
for(e = 1; e <= 5; e++)
{
if( (2 == b) + (3 == a) == 1 && \
(2 == b) + (4 == e) == 1 && \
(1 == c) + (2 == d) == 1 && \
(5 == c) + (3 == d) == 1 && \
(4 == e) + (1 == a) == 1)
{
flag = 0;
flag |= (1 << (a-1));
flag |= (1 << (b-1));
flag |= (1 << (c-1));
flag |= (1 << (d-1));
flag |= (1 << (e-1));
//方法一;
/*if( 1 == flag || 3 == flag || 7 == flag || 15 == flag || 31 == flag)
{
printf("a = %d b = %d c = %d d = %d e = %d",\
a,b,c,d,e);
printf("\n");
}*/
//方法二;
while(flag)
{
if(!(flag & 1))
{
break;
}
flag >>= 1;
}
if(flag == 0)
{
printf("a = %d b = %d c = %d d = %d e = %d",\
a,b,c,d,e);
printf("\n");
}
}
}
}
}
}
}
}
int main()
{
PlayNo();
system("pause");
return 0;
}
展示结果如下: