Я пытаюсь решить этот вопрос.
Описание задачи: Дана сетка 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 не проверяет способность следовать спецификации. - person paddy   schedule 24.06.2020pos += j
трюк еще актуален? - person paddy   schedule 24.06.2020**.
похоже на 2 хода и 2 камня, но я думаю, что код будет считать 3 хода и 2 камня. - person user3386109   schedule 24.06.2020**.
это два хода:**.
->*.*
->.**
. С*.**..
это 7 ходов:*.**..
->*.*.*.
->*.*..*
->*..*.*
->*...**
->.*..**
->..*.**
->...***
- person user3386109   schedule 26.06.2020