Advertisement
KiK0S

game 20-21 ege

Apr 2nd, 2021
896
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.29 KB | None | 0 0
  1. memory = {}
  2. '''
  3. возвращает 1, если игра выигрышная, 0 если проигрышная
  4. вторым вернется число ходов
  5. a камней в первой куче, b во второй
  6. '''
  7. def game(a, b):
  8.     '''
  9.     вдруг игра закончилась
  10.    
  11.     if a + 1 + b >= 49:
  12.         return 1
  13.     if a + b + 1 >= 49:
  14.         return 1
  15.     if a * 3 + b >= 49:
  16.         return 1
  17.     if a + b * 3 >= 49:
  18.         return 1
  19.     '''
  20.     if a + b >= 49:
  21.         return (0, 0)
  22.  
  23.     '''
  24.         Без мемоизации работает бесконечно долго ^_^
  25.     '''
  26.     global memory
  27.     if (a, b) in memory:
  28.         return memory[(a, b)]
  29.  
  30.     '''
  31.     переходим во всевозможные ситуации
  32.     '''
  33.     has_loose = 0
  34.     min_loose = 100000
  35.     max_win = 0
  36.  
  37.     moves = [
  38.         (a + 1, b),
  39.         (a * 3, b),
  40.         (a, b + 1),
  41.         (a, b * 3)
  42.     ]
  43.     for new_a, new_b in moves:
  44.         if game(new_a, new_b)[0] == 0:
  45.             has_loose = 1
  46.             min_loose = min(min_loose, game(new_a, new_b)[1] + 1)
  47.         else:
  48.             max_win = max(max_win, game(new_a, new_b)[1] + 1)
  49.     '''
  50.     был ли выигрышный переход
  51.     '''
  52.     if has_loose:
  53.         memory[(a, b)] = (1, min_loose)
  54.         return (1, min_loose)
  55.     memory[(a, b)] = (0, max_win)
  56.     return (0, max_win)
  57.  
  58. for start in range(1, 44):
  59.     print(start, game(5, start), sep = '\t')
  60.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement