📜  拼图 |球芽甘蓝游戏

📅  最后修改于: 2022-05-13 01:57:25.967000             🧑  作者: Mango

拼图 |球芽甘蓝游戏

给定 n 个位置和两个玩家。玩家需要将任意两个点连接起来而不与任何绘制的线相交,不能移动的玩家失败。确定谁将赢得玩家 1 或玩家 2。

例子 :

Input : n = 2
Output : player 2

Input : n = 3
Output : player 1

解释 :

方法:这场比赛的获胜者不取决于玩家选择的动作,而只取决于n。这个问题可以使用欧拉特征来解决。

根据欧拉特性:对于每个表面 S 都存在一个整数\\chi(S)这样,每当具有 V 个顶点和 E 个边的图 G 嵌入到 S 中以便有 F 个面(区域被图划分)时,则:



    $$ V - E + F = \\chi(S)$$

.

对于平面图\\chi(S) = 2 .

考虑最终画面(即最后一步之后的情况)。

使用欧拉特征的求解方法:
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