Форум » Теория игр » Тренировочная работа от 17/12/21 » Ответить

Тренировочная работа от 17/12/21

konyashkind: Добрый день! Прошу помощи, как это запрограммировать? Решил задачу только в excel, и то есть сомнения. Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень, добавить два камня или увеличить количество камней в куче в два раза. При этом нельзя повторять ход, который только что сделал второй игрок. Например, если в начале игры в куче 3 камня, Петя может первым ходом получить кучу из 4, 5 или 6 камней. Если Петя получил кучу из 5 камней (добавил 2 камня), то следующим ходом Ваня может получить 6 или 10 камней. Получить 7 камней Ваня не может, так как для этого нужно добавить 2 камня, а такой ход только что сделал Петя. Чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается, когда количество камней в куче становится не менее 34. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 34 или больше камней. В начальный момент в куче было S камней, 1 ≤ S ≤ 33. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.

Ответов - 3

Поляков: konyashkind пишет: как это запрограммировать? Например, так: [pre2] TARGET = 34 KADD1, KADD2, KMUL = 1, 2, 2 def gameOver( n1 ): return n1 >= TARGET def nextVariants( x, previousMove ): nextCodes = [(gameResult( x+KADD1, 1 ), 1), (gameResult( x+KADD2, 2 ), 2), (gameResult( x*KMUL, 3 ), 3) ] return [ code for code in nextCodes if code[1] != previousMove ] results = {} def gameResult( x, previousMove = -1 ): print( x, previousMove ) if (x, previousMove) in results: return results[(x, previousMove)] if gameOver(x): return 0 nextCodes = nextVariants( x, previousMove ) negative = [c for c in nextCodes if c[0] <= 0] if negative: move = max( negative, key = lambda x: x[0] ) res = - move[0] + 1 else: move = max( nextCodes, key = lambda x: x[0] ) res = - move[0] results[(x, previousMove)] = res return res from math import ceil ans1 = ceil( TARGET/KMUL - 1 ) ans2 = [] ans3 = [] for S in range(TARGET-1,0,-1): r = gameResult( S ) print( "%d: %d" % (S, r) ) if r == 2: ans2.append(S) if r == -2: ans3.append(S) #------------------------------------------------------- # Ответы на вопросы #------------------------------------------------------- print("--- Ответы на вопросы ---") print("1. ", ans1) print("2. ", sorted(ans2)) print("3. ", sorted(ans3))[/pre2]

konyashkind: Огромное спасибо!

pilot08: [pre2]def f(x,p): if x>=100 and p==4: return True else: if x<100 and p==4: return False else: if x>=100: return False if p%2==0: return f(x+1,p+1) else: return f(x+3,p+1) or f(x*3,p+1) if p%2==0: return f(x+3,p+1) else: return f(x*3,p+1)or f(x+1,p+1) if p%2==0: return f(x*3,p+1) else: return f(x+3,p+1) or f(x+1,p+1) for s in range(1,99): if f(s,1): print(s) print('====================================') def f(x,p): if x>=100 and p==2: return True else: if x<100 and p==2: return False else: if x>=100: return False if p%2==0: return f(x+1,p+1) else: return f(x+3,p+1) or f(x*3,p+1) if p%2==0: return f(x+3,p+1) else: return f(x*3,p+1)or f(x+1,p+1) if p%2==0: return f(x*3,p+1) else: return f(x+3,p+1) or f(x+1,p+1) for s in range(1,99): if f(s,1): print(s) [/pre2]




полная версия страницы