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

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

09.11.2021, 12:50. Показов 3630. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru