计算RPS游戏的最大胜利数

时间:2017-01-14 19:33:04

标签: java algorithm

我需要帮助编写一些代码来计算N次摇滚剪刀游戏的最大胜利。

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

2 个答案:

答案 0 :(得分:1)

好吧,让我们考虑如何订购价值的可能情况。我们可以构造一个环,每个数字都会丢失到下一个值。

  • 1失败aginst 2:2不能松散对1,所以它只能松散对3和3必须松散对1 1 < 2 < 3 < 1,其中a < b表示&#34; a反对b&#34;
  • 2对1:1的失败不能松散对2,所以它必须松散对3并且必须松散对2 1 > 2 > 3 > 1,其中a > b表示&#34;胜利对抗b&#34;

除了这两个之外没有其他可能性,因为每个号码必须分配一个&#34;赢得&#34;和一个失去的&#34;两个数字池中的数字。因此,我们有两种可能性来将数字排序为获胜/失败条件。

现在我们只需要计算第一个玩家赢得上述配置之一(w)和抽奖(d)的次数。因此,使用所选配置的玩家赢得的游戏数量为w,如果选择了相反的配置,则为N - draws - 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);

答案 1 :(得分:0)

首先,我们可以忽略具有两个相似数字的行,因为它们会产生平局(不影响分数),您可以使用以下提示:

  • 每一个(摇滚,纸张,剪刀)都有1个输,1个赢和1个平局组合作为例子:

    摇滚可以赢得剪刀,从纸上输掉,并用另一块摇滚画,所以如果你假设1-2让玩家1获胜,你可以看出1-3是输了

  • 您只能保存2D数组中每个player1 player2输入组合的数量
  • 您只有以下两种组合:
1-2胜利​​给出:   2-1,1-3,3-2输了   和2-3,2-2,3-1赢了

1-3胜利给出:   2-1,1-3,3-2获胜    和2-3,2-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]);