【C】推理题之判断名次

1、题目描述

  5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果,

A选手说:B第二,我第三;

B选手说:我第二,E第四;

C选手说:我第一,D第二;

D选手说:C最后,我第三;

E选手说:我第四,A第一;

  比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

2、算法分析

  首先,一共5位选手,那么每个人都需要遍历5次(每个人的排名有5种可能),然后设置筛选条件,即可得到每个人的名次,解决此类问题的关键就在于筛选的条件。由于每个选手都说对了一半,因此每位选手的陈述内容可以转换为(要么前者成立,要么后者成立,二者必居其一)。那么5位选手的陈述内容转换成表达式的值必然等于5(即就是说每位选手的陈述内容转换成表达式的值必为1),但这个筛选条件还不足以求出选手的名次,因为一个人一旦得了第一名,就不可能再得到第二名。每个人的名次必然是1-5之间的数字且不能重复,满足这个条件的值就是五个人名次的乘积,无论怎么排列,乘积一直都是1*2*3*4*5=120。综上所述,筛选条件只要满足表达式的值为6即可求出每位选手的名次(ps:找一个不会发生变化的量)。

3、源代码

#define _CRT_SECURE_NO_WARNINGS 1

/*
* Copyright (c) 2018, code farmer from sust
* All rights reserved.
*
* 文件名称:JudgeRank.c
* 功能:求解名次
*
* 当前版本:V1.0
* 作者:sustzc
* 完成日期:2018年4月4日23:07:24
*/

# include 

/*
*	函数名称:JudgeRank
*
*	函数功能:判断名次
*
*	入口参数:void
*
*	出口参数:void
*
*	返回类型:void
*/

void JudgeRank(void)
{
	int A = 0;
	int B = 0;
	int C = 0;
	int D = 0;
	int E = 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 (  6 == ( ((2 == B) && (3 != A)) || ((2 != B) && (3 == A)) ) 
							+ ( ((2 == B) && (4 != E)) || ((2 != B) && (4 == E)) ) 
							+ ( ((1 == C) && (2 != D)) || ((1 != C) && (2 == D)) ) 
							+ ( ((5 == C) && (3 != D)) || ((5 != C) && (3 == D)) )
							+ ( ((4 == E) && (1 != A)) || ((4 != E) && (1 == A)) )
							+ ( (120 == A*B*C*D*E) )  )
						{
							printf("A = %d, B = %d, C = %d, D = %d, E = %d\n",A, B, C, D, E);
						}
						else
						{
							;
						}
					}
				}
			}
		}
	}

	return;
}

int main(void)
{
	JudgeRank();

	return 0;
}

  不足:if判断条件过于繁琐,并且漏掉了5 == (A+B+C+D+E)这一条件,下面给出稍微优化后的代码。

/*
*	函数名称:JudgeRank
*
*	函数功能:判断名次
*
*	入口参数:void
*
*	出口参数:void
*
*	返回类型:void
*/

void JudgeRank(void)
{
	int A = 0;
	int B = 0;
	int C = 0;
	int D = 0;
	int E = 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 ( (1 == ((2 == B) + (3 == A))) && (1 == ((2 == B) + (4 == E)))
							&& (1 == ((1 == C) + (2 == D))) && (1 == ((5 == C) + (3 == D)))
							&& (1 == ((4 == E) + (1 == A))) && (120 == A * B * C * D *E)
							&& (15 == (A + B + C + D + E)) )
						{
							printf("A = %d, B = %d, C = %d, D = %d, E = %d\n",A, B, C, D, E);
						}
						else
						{
							;
						}
					}
				}
			}
		}
	}

	return;
}

4、输出结果


你可能感兴趣的:(C编程练习)