五位运动员参加了10米台跳水比赛,有人让他们预测比赛结果,各位选手都只说对了一半,请编程确定比赛的名次

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 
A选手说:B第二,我第三; 
B选手说:我第二,E第四; 
C选手说:我第一,D第二; 
D选手说:C最后,我第三; 
E选手说:我第四,A第一; 
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。 

 

 

 

 

认真思考一下午,终于想明白了如下代码,加油!!!

#include <stdio.h>
#include <windows.h>

int main()
{
	int a = 1;
	int b = 1;
	int c = 1;
	int d = 1;
	int e = 1;

	/*int n = 0;
	int flag = 0;*/

	for(a=1; a<=5; a++) //假设第一个人为第一
	{
		for(b=1; b<=5; b++)//假设第一个人为第一//可以并列第一
		{
			for(c=1; c<=5; c++)//假设第一个人为第一
			{
				for(d=1; d<=5; d++)//假设第一个人为第一
				{
					for(e=1; e<=5; e++)//假设第一个人为第一//依次循环列出所有结果
					{
						if(((b == 2)+(a == 3))== 1 && 
						   ((b == 2)+(e == 4))== 1 && 
						   ((c == 1)+(d == 2))== 1 && 
						   ((c == 5)+(d == 3))== 1 && 
						   ((e == 4)+(a == 1))== 1)    //满足题目条件(每个选手都说对一半)输出
						{
							printf("final result : a=%d, b=%d, c=%d, d=%d, e=%d\n", 
								                   a,b,c,d,e);  
						}
					}
				}
			}
		}
	}
	system("pause");
	return 0;
}
结果有错,有的排序没有第一名;我忽略了一个问题:没有排除不正常的名次,正常的名次应该没有断节

定义一个整形,使用整形的最低五个比特位来存五位选手名次,
从右到左比特位为第一名到第五名,  000 54321
比特位是 1 则该位 有名次, 例如   000 00101 有第一名和第三名,但没有第二名,错误
在原有条件加一点筛选条件让两个 1 之间没有 0 

第一题完整代码
int main()
{
	int a = 1;
	int b = 1;
	int c = 1;
	int d = 1;
	int e = 1;

	

	for(a=1; a<=5; a++) //假设第一个人为第一
	{
		for(b=1; b<=5; b++)//假设第一个人为第一//可以并列第一
		{
			for(c=1; c<=5; c++)//假设第一个人为第一
			{
				for(d=1; d<=5; d++)//假设第一个人为第一
				{
					for(e=1; e<=5; e++)//假设第一个人为第一//依次循环列出所有结果
					{
						if(((b == 2)+(a == 3))== 1 && 
						   ((b == 2)+(e == 4))== 1 && 
						   ((c == 1)+(d == 2))== 1 && 
						   ((c == 5)+(d == 3))== 1 && 
						   ((e == 4)+(a == 1))== 1)    //满足题目条件(每个选手都说对一半)输出
						{                                   
							int flag = 0;//置位             
                            flag = flag | (1 << (a-1));         
                            flag = flag | (1 << (b-1));        
                            flag = flag | (1 << (c-1));          5 4321   
						    flag = flag | (1 << (d-1));     //0000 0001 
							flag = flag | (1 << (e-1)); //按照名次在二进制中占位置
							while(flag)//循环结束 flag=0
							{
								if( flag%2 == 0)//排除低位1之间加有的0的这种排序!!!
								{
									break;//出现break则终止循环
								}
								flag /= 2;//判断有几个1
							}
							if (flag == 0)
						        printf("final result : a=%d, b=%d, c=%d, d=%d, e=%d\n", 
								                       a,b,c,d,e);  
					    }
				}
			}
		}
	}
	}
	system("pause");
	return 0;
	}

 

结果如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值