Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
26 / 21 / 6
Регистрация: 23.08.2018
Сообщений: 68

Ханойская башня

18.11.2019, 23:42. Показов 1035. Ответов 0

Студворк — интернет-сервис помощи студентам
Игрушка

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
class Disk:
    def __init__(self, number, color):
        self.number = number
        self.view = self.get_disk(number, color)
 
    def get_disk(self, number, color):
        disk = '\u2588' * (number*2+1)
        shift = ' ' * ((13-len(disk))//2)
        disk_line = f'{shift}{disk}{shift}'
        return f'\033[{color}m{disk_line}\033[0m'
 
def get_pole(pyramid):
    pole, j = [], 1
    height = len(pyramid)
    free = 6 - height
    for i in range(6):
        if i < free:
            pole.append('      \u2551      ')
        else:
            disk = pyramid[height - j]
            pole.append(disk.view)
            j += 1
    return pole
 
def show(poles):
    show_time = []
    for i in list('123'):
        show_time.append(get_pole(poles[i]))
    fmt = '{:^13}'*3
    print(fmt.format(1, 2, 3))
    for a, b, c in zip(*show_time):
        print(f'{a}{b}{c}')
 
def check_moves(move, poles):
    from_pole, to_pole = move.split()
    if from_pole == to_pole or \
            not from_pole in poles or\
            not to_pole in poles:
        return False
    fp = poles[from_pole]
    if len(fp) > 0:
        move_disk = fp[-1]
    else:
        return False
    tp = poles[to_pole]
    if len(tp) > 0:
        top_disk = tp[-1]
    else:
        return True
    if move_disk.number < top_disk.number:
        return True
    return False
 
def move(from_pole, to_pole, poles):
    fp, tp = poles[from_pole], poles[to_pole]
    tp.append(fp.pop())
 
def choice_n_disks():
    n_disks = 3
    s = input('Введите число дисков[1..5](по умолчанию 3):\n>> ').strip()
    if s in list('12345'):
        n_disks = int(s)
    low_steps = 2**n_disks-1
    print(f'Дисков в башне: {n_disks}.\nМинимальное число ходов,'
        f' за которые возможно перемещение: {low_steps}.')
    return n_disks, low_steps
 
def introduce():
    print('Головоломка "Ханойская башня".\n'
    'Правила:\n'
    '    башня состоит из дисков;\n'
    '    нужно переместить башню на вторую позицию;\n'
    '    перемещение происходит по одному диску за ход;\n'
    '    для перемещения доступны только верхние диски;\n'
    '    разрешается перемещать:\n'
    '        меньший диск на больший,\n'
    '        любой диск на позицию без дисков;\n'
    '    пример первого хода: 1 2\n'
    '        верхний диск с позиции 1 переместится на позицию 2;\n'
    )
 
def run_game(poles, win):
    show(poles)
    steps = 1
    while True:
        s = input(f'Ход {steps}, введите перемещение или exit:\n>> ')
        if s == 'exit':
            exit()
        elif len(s.split()) == 2 and check_moves(s, poles):
            move(*s.split(), poles)
            show(poles)
            if win == poles['2']:
                return steps
            steps += 1
        else:
            print(f'Ошибка ввода, не допустимое перемещение: "{s}".')
 
def get_poles(n_disks):
    colors = [91, 92, 94, 95, 96]
    poles = {
        '1': [],
        '2': [],
        '3': [],
    }
    pole = poles['1']
    for i in range(n_disks, 0, -1):
        pole.append(Disk(i, colors[i-1]))
    return poles, pole.copy()
 
def main():
    win_msg = 'Поздравляю! Башня перемещена! Ходов: '
    introduce()
    while True:
        n_disks, low_steps = choice_n_disks()
        poles, win = get_poles(n_disks)
        steps = run_game(poles, win)
        if steps == low_steps:
            print(f'{win_msg}{steps}. Отлично!!!')
        else:
            print(f'{win_msg}{steps}. Вы можете лучше!!!')
        s = input('Сыграем еще?([y]/n)\n>> ')
        if s == 'n':
            return
 
if __name__ == '__main__':
    main()
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.11.2019, 23:42
Ответы с готовыми решениями:

Ханойская башня
Уважаемые, киберфорумчане! Не знаю уже к кому идти, никак не решатся задачи. Весь гугл прочесан вдоль и поперек. Классическую интерпретацию...

Башня
Вот сейчас думаю, не могу решить следующую задачу: Петя в очередной раз купил себе набор из кубиков. На этот раз он выстроил из них...

Башня
Петя в очередной раз купил себе набор из кубиков. На этот раз он выстроил из них настоящую крепость — последовательность из N столбиков,...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.11.2019, 23:42
Помогаю со студенческими работами здесь

Задача "Башня"
Башня Петя в очередной раз купил себе набор из кубиков. На этот раз он выстроил из них настоящую крепость — последовательность из N...

Решение задачи "Ханойская башня" на 64 диска через if и for
Доброго времени суток! Не подскажете, как можно написать код, который смог бы выполнить задачу про ханойские башни без использования...

Останкинская башня
Останкинская телебашня вещает в эфир радиоволны дециметрового диапазона. Дальность приёма в условиях прямой видимости вычисляется по...

Башня Бурана
Здравствуйте. Помогите,пж,решить задачу: Бурана ограничение по времени на тест 0.5 секунд ограничение по памяти на тест 256...

Перевернутая башня
Вавилонцы решили построить удивительную башню - расширяющуюся кверху и содержащую бесконечное число этажей и комнат. Она устроена следующим...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Функция установки текстового статуса в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru