【问题标题】:Predict player win or lose, game theory question预测玩家输赢,博弈论问题
【发布时间】:2020-06-24 13:24:38
【问题描述】:

我正在尝试解决this question

问题描述:给定 n*m 网格,每个单元格要么是空的(用 . 表示),要么是有一个石头(用 * 表示)。两个玩家轮流交替,每个回合一个人可以:

1.如果该单元格为空,则将一块石头移至其相邻的右侧单元格

2.从网格中完全移除一块石头。

我们必须找出哪个玩家会赢。

基本上我的方法是,每当棋子的数量和可能的向右移动是偶数/奇数或反之亦然时,第一个玩家总是可以获胜,因为我们总是可以将其减少到偶数 - 根据我的说法是输状态。

但是我得到了错误的答案。 我找不到哪里出错了。

int main()
{
  int i,j,n,m,cnt,pos;
  char ch;
  while(true)
  {
      cin>>n>>m;
      if(n==0 && m==0)break;
      cnt=pos=0; //cnt store count of stones
      for(i=0;i<n;i++)
      {
            for(j=0;j<m;j++)
            {
                cin>>ch;
                if(ch=='*')
                {
                    cnt++;
                    pos+=(m-j-1); // this stone can be moved to m-j-1 places to right
                }
            }
      }
      if(cnt==1 || ((cnt&1)!=(pos&1)))cout<<"Player with first turn Wins"<<"\n";
      else cout<<"Player with second turn Wins"<<"\n";
    }
  return 0;
}

【问题讨论】:

  • 请以文字形式提供问题中的问题描述。请使用有意义的变量名。
  • 您似乎没有处理终止条件,其中nm 为零。此外,您应该注意输入的描述方式。如果一个竞赛式的问题说明有多少,甚至哪个字符在一行的位置中,那么如果你的代码不是处理基于行的输入对于任何旨在检查的输入都应该保证失败......嗯,这就是真正的竞赛问题的工作方式。也许 SPO 并没有测试遵循规范的能力。
  • @JohnFilleau 我已经更新了描述和变量。
  • 您甚至没有测试网格是否包含石头,因此您没有依据知道石头可以向任何方向移动多少个位置。
  • @paddy if(ch=='*) 条件处理它。

标签: c++ algorithm game-theory


【解决方案1】:

你的算法有逻辑问题,根据你的逻辑,先行动的人总是赢。假设你有一个 3x1 的格子,你有两个棋子,让数组如下:{full, full, empty},现在在这种情况下,第一个下手的人总是输,假设他移动到对它会变成 {full, empty, full} 然后第二个人将另一块石头向右移动 {empty, full, full} 然后他别无选择,只能移走石头,第二个玩家将移走其他棋子导致 finally 数组:{empty, empty, empty} 因此第一个玩家输了,如果第一个玩家用他的第一步移走棋子,第二个玩家将移走第二个棋子:再次导致 {空,空,空}组合。所以你不能只假设先走的玩家总是赢。

谢谢, 陈云飞

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 2019-09-17
  • 2019-07-15
  • 1970-01-01
相关资源
最近更新 更多