Форум » Теория игр » не сходится ответ № 3488 » Ответить

не сходится ответ № 3488

Korsvold: Решал 21 задание и не смог получить однозначный ответ Решение теории игр через Excel мне не по душе, и поэтому я решаю его программой Для решения я задания я составил следующую программу: [pre2] def nm(g): tmp = [] for i in g: tmp.append([i[0],i[1]+2]) tmp.append([i[0],i[1]*3]) tmp.append([i[0]+2,i[1]]) tmp.append([i[0]*3,i[1]]) return tmp def cm(g): tmp = [] for i in g: if sum(i) >= 45: tmp.append(True) else: tmp.append(False) return tmp for k in range(13,14): for s in range(1,44): if s+k > 43: break g = [[k,s]] g = nm(g) p1cm = cm(g) if True in p1cm: continue g = nm(g) v1cm = cm(g) g = nm(g) p2cm = cm(g) g = nm(g) v2cm = cm(g) tmp = [] for i in range(0,len(v2cm)-3,4): tmp.append(v2cm[ i] or v2cm[i+1] or v2cm[i+2] or v2cm[i+3]) for i in range(len(p2cm)): if tmp [ i]!=p2cm[ i] and tmp[ i] == True: p2cm[ i] = True else: p2cm[ i] = False tmp = [] for i in range(0,len(p2cm)-3,4): tmp.append(p2cm[ i] and p2cm[i+1] and p2cm[i+2] and p2cm[i+3]) for i in range(len(v1cm)): v1cm[ i] = tmp[ i] or v1cm[ i] tmp = [] for i in range(0,len(v1cm)-3,4): tmp.append(v1cm[ i] or v1cm[i+1] or v1cm[i+2] or v1cm[i+3]) for i in range(len(p1cm)): if tmp[ i] != p1cm[ i] and tmp[ i] == True: p1cm[ i] = True else: p1cm[ i] = False tmp = [] for i in range(0,len(p1cm)-3,4): tmp.append(p1cm[ i] and p1cm[i+1] and p1cm[i+2] and p1cm[i+3]) if False not in tmp: print(s) [/pre2] g - сокращение от "graph" - слой графа возможных в игре ходов, при заданных начальных значениях кучек nm - сокращение от "next move" - следующий ход(возвращает все возможные следующие ходы "ходящего" игрока) cm - сокращение от "check map" - проверить карту(функция возвращает слой графа, в котором числовые значения кучек с камнями заменены на состояния победы или не победы при данном ходе) алгоритм прост: 1)мы знаем что Ваня может выиграть своим 1 или 2 ходом, значит нам нужна хотя бы одна из 4 ветвей графа, которая на ход Вани заканчивается победой(True для cm(g)) из этого пункта следует то как я обрабатываю v1cm, v2cm(использование оператора or) - 1 и 2 ход Вани соответственно 2)также мы знаем что Ваня выигрывает после любого хода Пети, значит нам надо чтобы каждые четыре ветви хода Пети оканчивались "не победой" из этого пункта следует то условие, с которым я обрабатываю p1cm,p2cm(tmp[ i]!=pXcm[ ] and tmp[ i] == True) tmp[ i] хранит в себе состояние победы или не победы следующего игрока после текущего хода помимо этого из этого пункта следует то как я сжимаю p1cm,p2cm в tmp(через оператор and) по прохождению алгоритма список tmp хранить в себе только значения True если все условия задания выполняются, но алгоритм говорит, что помимо 1(правильного ответа), также подходят 4 и 5 не могу понять в чём проблема вроде логических ошибок нет

Ответов - 0



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