У нас есть бомба, которая тикает и может взорваться. Эта бомба имеет n переключателей, которые можно перемещать вверх или вниз. Некоторые комбинации этих переключателей запускают бомбу, но только одна комбинация отключает ее.
Наша задача - переместить переключатели из текущего положения в положение, которое блокирует бомбу, не взрывая ее в это время. Переключатели большие и неудобные, поэтому мы можем перемещать только один переключатель за раз.
Мы имеем, скажем, n = 4 переключателя в настоящее время в положении ^ vvv. Нам нужно вернуть их на позицию ^ v ^^. Запрещенные позиции: vvv ^, ^ vv ^, ^ v ^ v и ^^^ v.
а.) Мне пришлось нарисовать это вручную и найти кратчайшую последовательность движений переключателя, которая решает задачу - результат, который я получил, был 4 ... и я нашел две такие последовательности, если я прав ...
б.) Вот тут-то и получается - напишите код, который отвечает на поставленные выше вопросы / вопросы (кратчайшая последовательность и сколько). Код должен быть обобщен, чтобы он работал с другим числом переключателей и другими начальными, целевыми и запрещенными комбинациями; целевые и запрещенные комбинации могут быть несколько или даже меньше. Единственное, что мы точно знаем, это то, что переключатели имеют только два положения. Это также должно обеспечить возможность того, что желаемое условие недоступно; в этом случае программа должна, конечно, сказать.
c.) Следующие вопросы - это временная сложность кода, но сейчас я думаю, что я просто остановлюсь здесь ...
Вместо этого я использовал «0» и «1», потому что мне легче представить это.
Так что мой подход к этому был чем-то вроде жадного алгоритма (я думаю) - стартовая позиция, вы думаете обо всех возможных (разрешенных) позициях, игнорируете запрещенные, затем выбираете ту, в которой последовательность позиций имеет Наименьшее отличие от нашей последовательности таргетинга.
Ключевая часть кода, которую мне еще предстоит написать, и в этой части мне нужна помощь.
all_combinations = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011' , '1100', '1101', '1110', '1111']
def distance (position1, position2):
distance = 0
for i in range (len (position1)):
if position1 [i]! = position2 [i]:
distance + = 1
return distance
def allowed_positions (current, all_combinations):
allowed = set ()
for combination and all combinations:
if the distance (current, combination) == 1:
allowed.add (combination)
return allowed
def best_name (current, all_combinations, target):
list = []
for option and permitted_mood (current, all_combinations):
list.append (distance (option, target), option)