Блог пользователя mexmans

Автор mexmans, 14 лет назад, По-русски
1) Задача
Двое играют в следующую игру:
В ряд выстроены N белых камней, за один ход разрешается перекрасить один белый камень в черный, если соседние камни белые, проигрывает тот кто не может совершить ход.
2) Что я делаю? 
Пишу рекурсивную функцию подсчета функций Гранди, следующим образом:
если N = 0 то ответ очевидно 0 иначе
если N <= 3 то сопоставляю ним-число 1 (Выигрышная позиция) иначе
создаю пустое множество A
Запускаю цикл i от 1 до N если перекрасить i ый камень то мы придем в состояние из двух независимых игр меньшей размерности i - 2 и n - i - 1, считаю для каждой из них функцию Гранди и добавляю в множество A исключающее или двух полученных значений функции, обрабатывая граничные случаи.
Нахожу из данного множества минимальное неотрицательное число не встречающееся в нем. Возвращаю ответ.
3) Некоторые тесты
    4 проигрышная позиция (ок)
    5,6,7 выигрышная позиция (ок)
    8 проигрышная позиция (на что моя программа возвращает неверный результат) 
4) Что-то я делаю не правильно. Подскажите как можно свести эту игру к ним-игре и/или подскажите ошибку в моих рассуждениях. Спасибо.
  • Проголосовать: нравится
  • +9
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Т.е. можно красить белый в черный, если соседние камни отсутствуют?
14 лет назад, # |
Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится
Еще странно что переходы в i-2  и в n-i-1, кажется должно быть в i, n-i-1 (0-индексация)
14 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
И еще думаю для n=1, n=2 ответы 0, если считать, что для хода должны присутствовать соседние( а это ,кажется, так) 
14 лет назад, # |
Rev. 2   Проголосовать: нравится +8 Проголосовать: не нравится
База слишком большая. Для N = 3 число Гранди равно 2, так как можно походить и в 0, и в 1. Если сделать по общему алгоритму, начиная, скажем, с N = 1, всё будет хорошо.

Edit: впрочем, можно даже с N = 0 начать, вообще без базы. Минимальное неотрицательное число, не встречающееся в пустом множестве, равно нулю.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Единственная ошибка - для N=3 число Гранди 2. А так, мы точно также написали ту задачу на KBTU Open.
  • 14 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
    Почему для 3 число Гранди 2?
    • 14 лет назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится
      Сходив в край мы попадем в ситуацию 1 с числом Гранди 1. А сходив в центр попадем в ситуацию 0 с числом Гранди 0.
14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
Мне кажется, нужны еще как минимум два параметра динамики, допустим есть N подряд идущих камней, то нужно знать какие камни были по краям - это либо черная клетка, либо пустота.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Нет, просто нужно откусывать не только один поставленный камень, но ещё и его соседей, если они есть.
»
9 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

Не хочется создавать пост ради одного вопроса, поэтому бампаю этот. Итак, мы посчитали функцию Гранди для всех состояний игры и мы можем отвечать для каждого состояния, является ли оно проигрышным или выигрышным при оптимальной игре обеих сторон. А возможно ли, зная значения Гранди, восстановить процесс оптимальной игры? Т.е. какие именно ходы должны совершать игроки.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    Позиция выигрышная, если функция Гранди не равна 0, иначе проигрышная.

    Смотрим на наше состояние и перебираем ходы. Если наше состояние выигрышное, то из него можно пойти в проигрышное(у которого функция равна 0). Такой ход и будет оптимальным. Если состояние проигрышное, то все-равно проиграем, поэтому можно как угодно ходить :)