大家帮帮我,感激不尽

在一个名为“厨神争霸”的游戏中,n 个玩家每人制作一道菜并两两比较。比试的结果按照以下规则计分:一样好吃双方各得 1 分,获胜者得 3 分,失败者得 0 分。比赛结束后,每个人的得分将决定他们在游戏中的排名。

现在,你需要根据每个人的最终得分,计算有多少种可能的做菜结果组合。

【输入格式】

第一行包含一个正整数 n(1≤n≤8),表示制作人的数量。

第二行包含 n 个非负整数,即每个制作人的最终得分。

【输出格式】

输出仅一行,即可能的做菜结果组合数目。保证至少存在一个可能的结果组合。

【输入样例】

4
5 2 3 3
【输出样例】

1
【样例解释】

在这个样例中,有 4 个制作人,他们的最终得分分别是 5,2,3 和 3。

有 1 种可能的结果组合得到这些得分:

1 赢得与 2 的比赛,与 3、4 平局, 2 与 3、4 平局, 3 与 4 平局。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/707844
  • 除此之外, 这篇博客: C与C++程序设计学习笔记中的 5、汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,每次移动一个圆盘,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,柱子可以编号为A B C,编程输出n个圆盘从A柱子移动到C柱子的步骤。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 汉诺塔游戏:把所有盘子从A移动到C

    解题思路:
    (1)把A柱子上的前N-1个盘子借助C柱子,全部移动到B柱子上(过程暂不考虑),再把第N个盘子由A柱子移动到C柱子上,那么剩下要移动的盘子在B柱子上了。
    (2)把B柱子上的前N-2个盘子借助C柱子,全部移动到A柱子上(过程暂不考虑),再把第N-1个盘子由B柱子移动到C柱子上。
    (3)重复上面的两个步骤即可把A柱子上的盘子全部移动到C柱子上。

    #include <stdio.h>
    void loveyou(int n, char start, char help, char end)
    {
    	if (n >= 2)
    	{
    		loveyou(n - 1, start, end, help);
    		printf("%c------>%c\n", start, end);
    		loveyou(n - 1, help, start, end);
    	}
    	else if (n == 1)
    	{
    		printf("%c------>%c\n", start, end);
    	}
    }
    int main(void)
    {
    	int n = 0;
    	printf("输入圆盘的数量:");
    	scanf("%d", &n);
    	loveyou(n, 'A', 'B', 'C');
    	return 0;
    }
    

这个其实就是有向图添加边的操作,相当于有<8个节点,在所有可能添加的边(两个节点没有边,某个节点的分数少于最终的值)中,添加一条,以此递归,找到所有的可能。

@threenewbee你能发个代码吗?谢谢大佬