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