拼图 |球芽甘蓝游戏
给定 n 个位置和两个玩家。玩家需要将任意两个点连接起来而不与任何绘制的线相交,不能移动的玩家失败。确定谁将赢得玩家 1 或玩家 2。
例子 :
Input : n = 2
Output : player 2
Input : n = 3
Output : player 1
解释 :
方法:这场比赛的获胜者不取决于玩家选择的动作,而只取决于n。这个问题可以使用欧拉特征来解决。
根据欧拉特性:对于每个表面 S 都存在一个整数这样,每当具有 V 个顶点和 E 个边的图 G 嵌入到 S 中以便有 F 个面(区域被图划分)时,则:
.
对于平面图 .
考虑最终画面(即最后一步之后的情况)。
使用欧拉特征的求解方法:
1. 在最后的图片中,我们可以将每个交叉点作为一个顶点。
2. 连接这些交叉点的每条线都可以看作是一条边,
3. 每个区域部分(包括外面的部分)都可以看作是图形的一个面。
让,对于特定的 n 可能的移动次数是 m。为了解决这个问题,必须找到 m 的值。
观察:
1. 最初有 n 个交叉点(即 n 个顶点)。每一步都会产生一个新的十字架。因此,最后总有 V = (n+m) 个交叉(顶点)。
2.在每次移动中,当玩家通过一条线连接两个自由端并在直线上做一个新的交叉(创建一个新顶点)时,下一个玩家最终得到连接三个顶点的两条新边(旧2,新1)。因此,在 m 次移动之后,图中将有 E = 2*m 条边。
3. 可以看出,每个面内正好有一个自由端。因此,面的数量等于自由端的总数。同样,在每次移动中,玩家连接两个自由端(失去两个自由端)并创建两个新的自由端(通过制作一个新的交叉点)。因此,自由端的总数保持不变。因此,最初的自由端总数 = 面数,F = 4*n。
现在,它可以写成:V – E + F = 2
即 (n + m) – 2*m + 4*n = 2。
解这个方程,m = (5*n – 2)
现在,如果 m 是奇数,则玩家 1 将获胜,如果 m 是偶数,则玩家 2 将获胜。
C++
// C++ code to find out winner
// of Brussels Sprouts game.
#include
using namespace std;
// Function to find out winner of
// the game.
void winner(int n)
{
// Total number of moves m.
int m = 5 * n - 2;
// If m is odd Player 1 is winner
// If m is even Player 2 is winner.
if (m % 2 == 1)
cout << "Player 1" << endl;
else
cout << "Player 2" << endl;
}
// Driver code
int main()
{
// Test case 1
int n1 = 2;
winner(n1);
// Test case 2
int n2 = 3;
winner(n2);
return 0;
}
Java
// Java code to find out winner
// of Brussels Sprouts game.
import java.io.*;
class GFG {
// Function to find out winner of
// the game.
static void winner(int n)
{
// Total number of moves m.
int m = 5 * n - 2;
// If m is odd Player 1 is winner
// If m is even Player 2 is winner.
if (m % 2 == 1)
System.out.println("Player 1");
else
System.out.println("Player 2");
}
// Driver code
public static void main(String[] args)
{
// Test case 1
int n1 = 2;
winner(n1);
// Test case 2
int n2 = 3;
winner(n2);
}
}
// This code is contributed by vt_m.
Player 2
Player 1