在一个名为“厨神争霸”的游戏中,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 平局。
解题思路:
(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个节点,在所有可能添加的边(两个节点没有边,某个节点的分数少于最终的值)中,添加一条,以此递归,找到所有的可能。