猜名次问题

题目:

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

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

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

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

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

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

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

解题方法一:通过嵌套的循环遍历所有可能的排名组合,并检查每个选手说对了一半的条件是否满足。如果找到符合条件的排名组合,则输出比赛的名次。具体代码如下:

#include <stdio.h>

int main() {
    int a, b, c, d, e;

    // 遍历所有可能的排名组合
    for (a = 1; a <= 5; a++) 
    {
        for (b = 1; b <= 5; b++)
        {
            if (b == a) continue; // 确保每个选手的排名不同
            for (c = 1; c <= 5; c++)
            {
                if (c == a || c == b) continue;
                for (d = 1; d <= 5; d++) 
                {
                    if (d == a || d == b || d == c) continue;
                    e = 15 - a - b - c - d;
                    if ((b == 2 && a != 3) || (b != 2 && a == 3)
                        && (b == 2 && e != 4) || (b != 2 && e == 4)
                        && (c == 1 && d != 2) || (c != 1 && d == 2)
                        && (c == 5 && d != 3) || (c != 5 && d == 3)
                        && (e == 4 && a != 1) || (e != 4 && a == 1)) 
                    {
                        printf("比赛的名次为:\n");                          
                        printf("A是:%d\n", c);                              
                        printf("B是:%d\n", b);                                    
                        printf("C是:%d\n", a);                                      
                        printf("D是:%d\n", e);              
                        printf("E是:%d\n", d);
                        return 0;
                    }
                }
            }
        }
    }
        return 0;
}

输出的结果就是:

解题方法二:用递归函数来生成所有可能的排名组合。在每一层递归中,我们选择一个未被使用过的数字,并将其加入到当前位置。当生成了一个完整的排名组合后,通过调用 is_valid 函数来检查条件是否满足。如果满足条件,则输出比赛的名次。具体代码如下:

#include <stdio.h>
bool checkData(int* p)
{
	for (int i = 0; i < 5; i++)
	{
		for (int j = i + 1; j < 5; j++)
		{
			if (p[i] == p[j])
			{
				return false;
			}
		}
	}

	return true;
}
void diveRank(int* p, int n)
{
	if (n >= 5) //此时的n是用来控制循环层数的。
	{
		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 && 
			checkData(p)) //查重
		{
			printf("A B C D E\n");
			for (int i = 0; i < 5; ++i)
			{
				
				printf("%d ", p[i]);
			}
			printf("\n");
		}
		return;
	}

	for (p[n] = 1; p[n] <= 5; p[n]++)
	{
		diveRank(p, n + 1); 
	}
}

int main()
{
	int p[5] = { 0 };

	diveRank(p, 0);

	return 0;
}

输出的结果是:

以上就是我对这个问题的解决思路,希望对大家有所帮助。

猜你喜欢

转载自blog.csdn.net/m0_70570933/article/details/132099245