Ханойская башня на Python 3. Ввод: Первая строка содержит количество дисков - натуральное число N (N≤10^5). Вторая строка файла содержит строку символов длины N. Для каждого i (1≤i≤N) i-й символ - 'A', если диск с номером i находится на стержне A, 'B' - если на стержне B, 'C' - если на стержне C. Вывод: В единственной строке должно быть выведено одно неотрицательное число - минимальное количество оборотов, необходимое для того, чтобы все диски располагались на стержне B, согласно модулю 10^9 + 9. Последнее условие не имеет другого смысла, кроме уменьшения размера выходного числа.
Например, если пять дисков расположены, как показано на рисунке 2, то требуется 10 ходов, чтобы расположить их на стержне B: A → C, B → C, A → B, C → B, C → A, B → A, C → B, A → C, A → B, C → B. Чтобы упростить задачу, на этот раз вам нужно будет найти только наименьшее количество необходимых ходов. Напишите программу, определяющую минимально необходимое количество оборотов после модуля 10 ^ 9 + 9 для данной колесной формулы, чтобы все колеса были помещены на стержень B.
1) Один байт = 8 бит, максимальное число 2^8 - 1 = 255, если числа без знака. Для знаковых чисел старший бит отводится под знак числа, следовательно, минимальное число = - 2^7 - 1 = - 127, максимальное число = + 127 2) Число 1607, ячейка двухбайтовая, один бит под знак, следовательно, под число отводится 15 бит, в двоичном представлении 1607(10) = 11001000111(2), дополняем до 16 бит, старший бит - знаковый - нулевой, так как число положительное = 0000011001000111(2) - это двоичное представление в двухбайтовой ячейке, чтобы получить шестнадцатиричное представление, разбиваем число справа - налево по 4 бита 0000 0110 0100 0111 и записываем в шестнадцатиричном виде 0111(2) = 7(16) 0100(2) = 4(16) 0110(2) =6(16) 0000(2) = 0(16) 1607(16) = 0647(16) или без старшего не значащего нуля = 647(16) 3) для получения дополнительного кода числа, находят обратное число, или инверсию числа, для этого каждый бит числа изменяют на противоположный, 1 на 0, 0 на 1 105(10) = 1101001(2) - это и есть дополнительный код числа - 105, т.е. дополнительным кодом числа (- а) будет число а. Найдем дополнительный код в однобайтовой ячейке числа 105(10) = 01101001(2), а) находим обратное 01101001(2) ->(обратное) ->10010110(2) б) дополнительный код-> обратный код + 1 ->(дополнительный)->10010111(2), а это число - 105 потому, что отрицательные числа представляются в дополнительном коде. Если для числа - 105 найти дополнительный код, то получим число 105 10010111(2)->(дополнительный)->01101000+1->01101001 = 69(16) = 16*6+9 = 96+9 = 105
Программа: a = input("Введите текущую координату фигуры(вертикаль): ") b = input("Введите текущую координату фигуры(горизонталь): ") c = input("Введите координату для хода(вертикаль): ") d = input("Введите координату для хода(горизонталь): ") # Условие if (a==c) and (b==c): #Конец условия print("Фигура может сделать ход") else: print("Фигура НЕ может сделать ход") Условия: а) if (a==c) and (b==c): #ладья б) if abs(a-c) == abs(b-d): #слон в) if abs(a-c)==1 or abs(b-d)==1: #король г) if abs(a-c) == abs(b-d) or a == c or b == d: #ферзь ж) if((abs(abs(a-c)-2)<0.5) and (abs(abs(b-d)-1)<0.5) or (abs(abs(a-c)-1)<0.5) and (abs(abs(b-d)-2.0)<0.5)): #конь
= - 127, максимальное число = + 127
2) Число 1607, ячейка двухбайтовая, один бит под знак, следовательно, под число отводится 15 бит, в двоичном представлении 1607(10) = 11001000111(2), дополняем до 16 бит, старший бит - знаковый - нулевой, так как число положительное
= 0000011001000111(2) - это двоичное представление в двухбайтовой ячейке, чтобы получить шестнадцатиричное представление, разбиваем число справа - налево по 4 бита
0000 0110 0100 0111 и записываем в шестнадцатиричном виде
0111(2) = 7(16) 0100(2) = 4(16) 0110(2) =6(16) 0000(2) = 0(16)
1607(16) = 0647(16) или без старшего не значащего нуля = 647(16)
3) для получения дополнительного кода числа, находят обратное число, или инверсию числа,
для этого каждый бит числа изменяют на противоположный, 1 на 0, 0 на 1
105(10) = 1101001(2) - это и есть дополнительный код числа - 105, т.е. дополнительным кодом
числа (- а) будет число а.
Найдем дополнительный код в однобайтовой ячейке числа 105(10) = 01101001(2),
а) находим обратное 01101001(2) ->(обратное) ->10010110(2)
б) дополнительный код-> обратный код + 1 ->(дополнительный)->10010111(2), а это число - 105
потому, что отрицательные числа представляются в дополнительном коде.
Если для числа - 105 найти дополнительный код, то получим число 105
10010111(2)->(дополнительный)->01101000+1->01101001 = 69(16) = 16*6+9 = 96+9 = 105
a = input("Введите текущую координату фигуры(вертикаль): ")
b = input("Введите текущую координату фигуры(горизонталь): ")
c = input("Введите координату для хода(вертикаль): ")
d = input("Введите координату для хода(горизонталь): ")
# Условие
if (a==c) and (b==c):
#Конец условия
print("Фигура может сделать ход")
else:
print("Фигура НЕ может сделать ход")
Условия:
а) if (a==c) and (b==c): #ладья
б) if abs(a-c) == abs(b-d): #слон
в) if abs(a-c)==1 or abs(b-d)==1: #король
г) if abs(a-c) == abs(b-d) or a == c or b == d: #ферзь
ж) if((abs(abs(a-c)-2)<0.5) and (abs(abs(b-d)-1)<0.5)
or (abs(abs(a-c)-1)<0.5) and (abs(abs(b-d)-2.0)<0.5)): #конь