Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
Studying
 Аватар для Vermont74
2 / 2 / 0
Регистрация: 13.03.2021
Сообщений: 38

Задача Ним с тремя кучками и без ограничения на кол-во забираемых камней

09.11.2021, 12:50. Показов 3706. Ответов 6

Студворк — интернет-сервис помощи студентам
Мне очень нужна помощь. Делаю задачу уже месяц... Никак не могу решить.

Игра ним для двух игроков с тремя кучами и без ограничения на количество забираемых камней. Напишите программу с «искусственным интеллектом» (ИИ), которая играет против пользователя и выигрывает, если может. Исходное количество камней в кучах задаёт пользователь, программа всегда ходит первой. Выигрывает забравший последний камень, и при окончании игры нужно объявить победителя. Алгоритм игры выглядит следующим образом:

Сначала пользователь вводит количества камней в кучах (натуральные числа, каждое на новой строке). Затем первый ход делает программа и выводит через пробел пять чисел: из какой кучи взяты камни; сколько камней взято; сколько камней осталось в кучах, сначала в первой, затем во второй, а потом и в третьей Затем ход делает пользователь: вводит на отдельных строках номер кучи и количество камней, которые он хочет взять. Если ход некорректный, например, пользователь пытается взять камней больше, чем есть в куче, программа должна вывести: Некорректный ход: <куча> <кол-во камней> и ожидать нового ввода пользователя. После каждого корректного хода игрока или ИИ нужно выводить пять чисел, как и после первого хода ИИ. Если выигрывает игрок, то надо вывести фразу: Вы выиграли!, а если ИИ – фразу: ИИ выиграл! Все сообщения программы должны строго соответствовать условию.

Формат ввода Для старта игры вводятся три натуральных числа. Пример диалога игры:

2
2
2
1 2 0 2 2
1
2
Некорректный ход: 1 2
1
0
Некорректный ход: 1 0
2
1
2 1 0 1 2
3 1 0 1 1
2
1
2 1 0 0 1
3 1 0 0 0
ИИ выиграл!

Написал такой код, но проверяющая система просто выдает error и все. Я не понимаю, в чем проблема. Очень нужна помощь, помогите пожалуйста! Просто скажите, в чем ошибка, или, может, посоветуйте другой метод решения!
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
if step == 'ii': # если ходит ии
        if heap1 == 0 and heap2 == 0 and heap3 == 1: # проверка, если в 3 куче 1 камень, то забрать его
            step_heap_ii = 3
            step_num_ii = heap3 
            heap3 -= step_num_ii
            print(step_heap_ii, step_num_ii, heap1, heap2, heap3)
            step = 'user'
            continue
        elif heap1 == 0 and heap2 == 1 and heap3 == 0: # то же самое, но с другой кучкой
            step_heap_ii = 2
            step_num_ii = heap2 
            heap2 -= step_num_ii
            print(step_heap_ii, step_num_ii, heap1, heap2, heap3)
            step = 'user'
            continue
        elif heap1 == 1 and heap2 == 0 and heap3 == 0: # то же самое, но с другой кучкой
            step_heap_ii = 1
            step_num_ii = heap1 
            heap1 -= step_num_ii
            print(step_heap_ii, step_num_ii, heap1, heap2, heap3)
            step = 'user'
            continue
        elif step_heap_user == 2: # если user взял камни из 2 кучки
            if heap2 == 0: # если он забрал все камни из 2 кучки, то забрать все из 3
                step_heap_ii = 3
                step_num_ii = heap3
                heap3 -= step_num_ii
                print(step_heap_ii, step_num_ii, heap1, heap2, heap3)
                step = 'user'
                continue
            elif heap2 == 1: # если он забрал все, кроме одного, забрать из 3 тоже все, кроме 1
                step_heap_ii = 3
                step_num_ii = heap3 - 1
                heap3 -= step_num_ii
                print(step_heap_ii, step_num_ii, heap1, heap2, heap3)
                step = 'user'
                continue
            elif heap3 == 1: # то же самое, но с другой кучкой
                step_heap_ii = 3
                step_num_ii = heap3 - 1
                heap3 -= step_num_ii
                print(step_heap_ii, step_num_ii, heap1, heap2, heap3)
                step = 'user'
                continue
            elif heap2 == heap3: # если кучки равны, то забрать все, кроме 1 из 2 кучки
                step_heap_ii = 2
                step_num_ii = heap2 - 1
                heap2 -= step_num_ii
                print(step_heap_ii, step_num_ii, heap1, heap2, heap3)
                step = 'user'
                continue
            else: # если же ни одно из условий не выполняется (крайне маловероятно), то забрать все, кроме 1 из 2 кучки
                step_heap_ii = 2
                step_num_ii = heap2 - 1
                heap2 -= step_num_ii
                print(step_heap_ii, step_num_ii, heap1, heap2, heap3)
                step = 'user'
                continue
        elif step_heap_user == 3: # те же действия, только с 3 кучкой
            if heap3 == 0: # если он забрал все камни из 3 кучки, то забрать все из 2
                step_heap_ii = 2
                step_num_ii = heap2
                heap2 -= step_num_ii
                print(step_heap_ii, step_num_ii, heap1, heap2, heap3)
                step = 'user'
                continue
            elif heap3 == 1: # если он забрал все, кроме одного, забрать из 2 тоже все, кроме 1
                step_heap_ii = 2
                step_num_ii = heap2 - 1
                heap2 -= step_num_ii
                print(step_heap_ii, step_num_ii, heap1, heap2, heap3)
                step = 'user'
                continue
            elif heap2 == 1: # то же самое, но с другой кучкой
                step_heap_ii = 3
                step_num_ii = heap3 - 1
                heap3 -= step_num_ii
                print(step_heap_ii, step_num_ii, heap1, heap2, heap3)
                step = 'user'
                continue
            elif heap2 == heap3: # если кучки равны, то забрать все, кроме 1-го из 2-ой кучки
                step_heap_ii = 2
                step_num_ii = heap2 - 1
                heap2 -= step_num_ii
                print(step_heap_ii, step_num_ii, heap1, heap2, heap3)
                step = 'user'
                continue
            else: # если же ни одно из условий не выполняется (крайне маловероятно), то забрать все, кроме 1 из 2 кучки
                step_heap_ii = 3
                step_num_ii = heap3
                heap3 -= step_num_ii
                print(step_heap_ii, step_num_ii, heap1, heap2, heap3)
                step = 'user'
                continue
        elif step_heap_user == 0: # это, похоже, если ход пользователя неверный... сам не понимаю :/
            step_heap_ii = 1
            step_num_ii = heap1
            heap1 -= step_num_ii
            print(step_heap_ii, step_num_ii, heap1, heap2, heap3)
            step = 'user'
            continue
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.11.2021, 12:50
Ответы с готовыми решениями:

Игра ним для двух игроков с двумя кучами и без ограничения на количество забираемых камней
Игра ним для двух игроков с двумя кучами и без ограничения на количество забираемых камней. Напишите программу с «искусственным...

Задача Ним с тремя кучками и без ограничения на кол-во забираемых камней
Мне очень нужна помощь. Делаю задачу уже месяц... Никак не могу решить. Игра ним для двух игроков с тремя кучами и без ограничения на...

Игра Ним с тремя кучами для одного игрока без ограничений на количество забираемых камней
Игра Ним с тремя кучами для одного игрока без ограничений на количество забираемых камней. На первой, второй и третьей строках...

6
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
10.11.2021, 08:56
Vermont74, логика проста:

1) Если в трёх кучах камни, забираем одну кучу полностью.
2) Если в двух кучах камни, забираем все камни кроме одного из любой кучи.
3) Если осталась куча с камнями, победа, иначе поражение.
0
Studying
 Аватар для Vermont74
2 / 2 / 0
Регистрация: 13.03.2021
Сообщений: 38
10.11.2021, 20:09  [ТС]
Fudthhh, то есть схема, которую я использую в своем коде, верна, и проблема вовсе не в этом?
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
11.11.2021, 13:28
Vermont74, такую кучу воды мне стало лень черпать.

Глянув на задачу с чистой головой, подправлю свой алгоритм, цель бота оставить к ходу соперника две кучи с 1 камнем.
0
Studying
 Аватар для Vermont74
2 / 2 / 0
Регистрация: 13.03.2021
Сообщений: 38
11.11.2021, 14:30  [ТС]
Fudthhh, можешь потом прислать его мне? пожалуйста, мне очень надо!
0
Эксперт Python
 Аватар для unfindable_404
693 / 471 / 204
Регистрация: 22.03.2020
Сообщений: 1,051
11.11.2021, 20:32
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
heaps = [int(input()) for _ in range(3)]
 
user_step = False
 
while any(heaps):
    if user_step:
        heap = int(input())
        count = int(input())
        if 1 <= heap <= 3 and heaps[heap - 1] >= count and count != 0:
            heaps[heap - 1] -= count
 
            print(heap, count, *heaps)
        else:
            print(f'Некорректный ход: {heap} {count}')
            continue
    else:
 
        # before_count - количество камней в куче, из которой берём камни
        # take_count - количество камней, которое забираем из кучи
 
        # Количество куч с камнями
        heaps_with_stones = sum(bool(heap) for heap in heaps)
 
        # Если камни остались только в одной куче
        if heaps_with_stones == 1:
            before_count = take_count = sum(heaps)
 
        # Если камни остались в двух кучах
        elif heaps_with_stones == 2:
 
            _, min_count, max_count = sorted(heaps)
 
            if max_count == 2 and min_count <= 2:
                before_count = 2
                take_count = 1
            elif max_count == 1 and min_count == 1:
                before_count = 1
                take_count = 1
            elif min_count == 1:
                before_count = max_count
                take_count = max_count - 1
            else:
                before_count = max_count
                take_count = max_count - 2
 
        # Если камни остались в трёх кучах
        else:
            # Забираем все камни из кучи с минимальным количеством камней
            take_count = before_count = min(heaps)
 
        for heap, count in enumerate(heaps):
            if count == before_count:
                heaps[heap] -= take_count
                print(heap + 1, count, *heaps)
                break
    user_step = not user_step
 
 
if not user_step:
    print('Вы выиграли!')
else:
    print('ИИ выиграл!')
0
Studying
 Аватар для Vermont74
2 / 2 / 0
Регистрация: 13.03.2021
Сообщений: 38
13.11.2021, 20:38  [ТС]
unfindable_404, большое тебе спасибо! только тут такие приемчики, за которые я получу от преподавателя, ведь я их не должен знать . Вообще мы даже до списков не дошли...
Я отредактирую под себя, если получится
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.11.2021, 20:38
Помогаю со студенческими работами здесь

Игра ним для двух игроков с одной кучей и ограничением на количество забираемых камней
Игра ним для двух игроков с одной кучей и ограничением на количество забираемых камней: за один ход можно взять не больше трёх камней. ...

Игра "Ним" с тремя кучами камней
Игра ним с тремя кучами камней, начальное количество камней в кучах задаёт пользователь. Компьютер (ИИ) играет против пользователя и ходит...

Игра ним с двумя кучами камней, начальное количество камней в кучах задаёт пользователь
Игра ним с двумя кучами камней, начальное количество камней в кучах задаёт пользователь. Компьютер (ИИ) играет против пользователя и...

3. Игра Ним с одной кучей камней и с инвертированными правилами
Решите задачу методом динамического программирования : Игра Ним с одной кучей камней и с инвертированными правилами (взявший последний...

Сопоставление ограничения, введенного без указания имени ограничения, и имени соответствующего столбца средствами SSMS
Если для какого-то столбца введено ограничение UNIQUE или DEFAULT без явного указания имени ограничения (что конечно не комильфо), то есть...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru