Программирование по игре «Ним»

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

bool winning(int x, int y, int z)
//x,y,z = number of stones in the 3 piles.
//returns true if this is a winning position.
{
    if (x==0 && y==0 && z==0) return false;    // base case

    for (int i=1; i<=x; ++i)                   // Pick i stones from pile 1
        if (!winning(x-i, y, z)) return true;  // if a losing next state is found

    for (int i=1; i<=y; ++i)                   // Pick i stones from pile 2
        if (!winning(x, y-i, z)) return true;  // if a losing next state is found

    for (int i=1; i<=z; ++i)                   // Pick i stones from pile 3
        if (!winning(x, y, z-i)) return true;  // if a losing next state is found

    return false;                              // if all next states are winning
}
int main() {
    int x,y,z;
    cout << "Give the number of stones in the 3 piles: ";
    cin >> x >> y >> z;
    if (winning(x,y,z)) cout << "Wins." << endl;
    else cout << "Loses." << endl;
}

Что на самом деле делает код? Каждый цикл в конечном итоге заканчивается в точках x=0, y=0 и z=0. Затем, как программа различает разные значения. (Возможно, я не понял использования некоторых общих команд, таких как «возврат», пожалуйста, объясните и это.)

Это C++ с добавленным пакетом simplecpp. Так что не обращайте внимания на синтаксис.

KeShAw 08.08.2024 21:37

что такое «простопп»? Называть main_program «простым» несколько странно. Было бы просто показать реальный код, а не прятать его за глупыми макросами.

463035818_is_not_an_ai 08.08.2024 21:40

в любом случае вы спрашиваете нас, что делает код, но в то же время мы не должны обращать внимание на синтаксис, который не соответствует C++. Мы не сможем сказать вам, что делает код, пока вы не покажете нам этот заголовок. Я придираюсь к деталям, но детали имеют значение.

463035818_is_not_an_ai 08.08.2024 21:42

@ 463035818_is_not_an_ai это пакет, установленный для обучения первокурсников C++.

KeShAw 08.08.2024 21:43

проблема в том, что он учит вас не-С++. main_program это не C++. Отсутствие правильных заголовков — это не C++.

463035818_is_not_an_ai 08.08.2024 21:44

Итак... Вы хотите узнать Тайну Нима... Это Мыши.

user4581301 08.08.2024 21:46

@ 463035818_is_not_an_ai Да, это будет int main(). Кроме этого, все так, как должно быть. Пожалуйста, сосредоточьтесь на его семантике.

KeShAw 08.08.2024 21:47

«Каждый цикл в конечном итоге заканчивается в точках x=0, y=0 и z=0». откуда вы знаете? Я так не думаю. Вам следует использовать отладчик, чтобы увидеть, что на самом деле происходит.

463035818_is_not_an_ai 08.08.2024 21:47

Я вообще не понимаю вопроса "как программа различает разные значения". какие разные значения?

463035818_is_not_an_ai 08.08.2024 21:49

Я имею в виду серьезно. После того, как я раскритиковал все, что нашел, что можно покритиковать по этому вопросу, я теперь нахожусь в режиме помощи. И лучшая помощь, которую вы можете получить, — это ваш отладчик. Кто-то другой, объясняющий вам, что делает код, только украдет у вас прекрасную возможность научиться использовать отладчик.

463035818_is_not_an_ai 08.08.2024 21:52

Если вы не можете использовать отладчик, потому что используемая вами система не позволяет этого, скопируйте код в систему, которая позволяет вам использовать отладчик, и используйте отладчик. Если вы ВСЕ ЕЩЕ не можете использовать отладчик, добавьте в код больше операторов печати, чтобы предоставить вам диагностическую информацию, которую вам предоставил бы отладчик. Пара cout << x << ','<< y << ','<< z << '\n'; в стратегических точках winning расскажет вам почти все, что вы хотите знать.

user4581301 08.08.2024 21:56

@KeShAw «Так что не обращайте внимания на синтаксис». -- Не обращая внимания на то, что вам следует делать, подумайте об этом с дипломатическим складом ума. С точки зрения читателя, синтаксис ненадежен, и нет никакой мотивации его адаптировать, учитывая, что читатели — добровольцы. Голосование «против» или «закрыто» — это легкая реакция на шаткость. Правильно это или нет, но такое случается. С другой стороны, вы знаете, что синтаксис шаткий. Вы знаете, что люди будут против этого. Вы даже знаете, как сделать синтаксис не шатким. Однако вы не хотите его чистить (и тестировать код, чтобы убедиться, что он по-прежнему ведет себя так же). Почему? Вам нужен плохо принятый вопрос?

JaMiT 09.08.2024 02:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
13
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обоснование кода следующее:

  • Если все стопки пусты, я проиграл. Верните false, потому что нет возможности войти.
  • В противном случае попробуйте каждый законный ход. Разрешенные ходы заключаются в удалении одного или нескольких камней из одной стопки, поэтому для проверки каждого возможного хода используются циклы. Позиция, возникшая в результате хода, проверяется на предмет того, есть ли в ней выигрышный ход для игрока, находящегося в этой позиции. Если нет, если это вынужденная проигрышная позиция для другого игрока, то для меня это выигрышный ход. Верните true, потому что есть выигрышный ход.
  • Если ни один из допустимых ходов не привел к выигрышному ходу, верните false, поскольку способа выиграть нет.

Если у вас остались вопросы, вам следует отследить код, выполнив его вручную. Выясните, что он делает с winning(0, 1, 0) и с winning(1, 1, 1).

Другие вопросы по теме