Java 完成RPS游戏的最大赢取次数

Java 完成RPS游戏的最大赢取次数,java,algorithm,Java,Algorithm,我需要帮助写一些代码,计算最大可能的胜利在N游戏的石头剪刀布 我得到了数字N,这是石头剪纸游戏的数量,后面是N组整数(1,2,3),每个整数都链接到石头,布或剪刀。但是,我们不知道每个选项的链接数。我需要帮助计算第一个人可能赢得的最大游戏数量。 < P>,让我们考虑可能如何排序价值的案例。我们可以构造一个环,其中每个数字丢失到下一个值 1相对于2松开:2不能相对于1松开,因此只能相对于3松开,3必须相对于1松开,因此1b表示“a赢b” 除了这两种可能性之外,没有其他可能性,因为每个号码都必须

我需要帮助写一些代码,计算最大可能的胜利在N游戏的石头剪刀布


我得到了数字N,这是石头剪纸游戏的数量,后面是N组整数(1,2,3),每个整数都链接到石头,布或剪刀。但是,我们不知道每个选项的链接数。我需要帮助计算第一个人可能赢得的最大游戏数量。

< P>,让我们考虑可能如何排序价值的案例。我们可以构造一个环,其中每个数字丢失到下一个值

  • 1相对于2松开:2不能相对于1松开,因此只能相对于3松开,3必须相对于1松开,因此
    1<2<3<1
    ,其中
    a
    表示“a相对于b松开”
  • 2输给1:1不能输给2,所以它必须输给3,必须输给2所以
    1>2>3>1
    ,其中
    a>b
    表示“a赢b”
除了这两种可能性之外,没有其他可能性,因为每个号码都必须从两个号码中分配一个“赢”和一个“输”号码。因此,我们有两种可能将数字排序为赢/输条件

现在我们只需要计算第一个玩家在选择上述配置之一(
w
)和抽签(
d
)时获胜的次数。因此,使用所选配置,玩家赢得的游戏数量为
w
,或者如果选择相反的配置,则为
N-平局-w

int[] A = readPlayerOne();
int[] B = readPlayerTwo();

int draws = 0;
int wins = 0;

for(int i = 0; i < N; i++)
{
    if(A[i] == B[i])
        draws++;
    else if(A[i] - 1 == B[i] || A[i] == 1 && B[i] == 3)
        //wins according to the first configuration
        wins++;
}

return max(N - draws - wins, wins);
int[]A=readPlayerOne();
int[]B=readPlayerTwo();
int=0;
int=0;
对于(int i=0;i
首先,我们可以忽略具有两个相似数字的线,因为它们产生平局(不影响分数),您可以利用以下提示:

  • 每个(石头、布、剪刀)都有1个输、1个赢和1个平局组合,例如:

    石头能赢剪刀,能输纸牌,能用另一块石头画画,所以如果你假设1-2让玩家1赢,你就能知道1-3是输的

  • 您只能在二维数组中保存每个组合的player1 player2输入的计数

  • 您只有以下两种组合:

1-2胜出: 2-1,1-3,3-2输 2-3,1-2,3-1获胜

1-3胜出: 2-1,1-3,3-2获胜 2-3,1-2,3-1输了

因此,您可以简单地获得它们的最大值

int in[][] = new int[4][4];
for(int i=0;i<4;i++)
    for(int j=0;j<4;j++)
        in[i][j] = 0;

for (int i = 0 ; i < N; i++) {
    int p1 = scan.nextInt();
    int p2 = scan.nextInt();
    if(p1 != p2)
        in[p1][p2]++;
}

int maxWins = Math.max(in[1][2]+in[2][3]+in[3][1], 
                       in[1][3]+in[2][1]+in[3][2]);
int in[][]=新int[4][4];

对于(int i=0;iYou只有6种可能为游戏选择(石头、布、剪刀)分配数字。为什么不使用暴力?对于这些可能,有六种不同的方法,然后主要使用比较语句是否有效?我可能采用这种方法