Задать вопрос

Давно не решали занимательные задачки на Хабре?



Решил возобновить традицию решения занимательных задач на Хабре :)
Предлагаю математическую задачку под названием «Волшебный шарик».

На столе стоит 10 непрозрачных стаканов. Под одним из них лежит шарик. За каждый ход можно поднять один из стаканов и проверить, есть ли там шарик. Если шарик найден — выигрыш. Если под стаканом шарика не оказалось, он перемещается в соседний справа стакан. При этом он может переместиться и в тот стакан, который только что проверили. Если шарик в крайнем справа стакане — он никуда не перемещается. Будем считать, что если вы точно знаете, где шарик (например проверили 9 стаканов), вам всё равно нужно поднять последний стакан и увидеть под ним шарик (это нужно для точного подсчёта ходов).

Задача заключается в том, чтобы определить, за какое минимальное количество ходов можно гарантированно найти шарик.

Удачного решения.
P.S. Всем спасибо.
  • Вопрос задан
  • 3149 просмотров
Подписаться 9 Оценить Комментировать
Ответ пользователя Павел Тысляцкий К ответам на вопрос (7)
Сперва думал что нашел решение с 5ю попытками, потом решил проверить кодом: для 5и и меньше попыток решения не нашел, для 6и 1056 разных решений, причем последний ход не всегда заканчивается поднятием последнего стакана.
Или же мой код неверен.

Решение в лоб для 5и попыток:

wins = 0
# i1, i2, i3 и тд - выбор стакана на 1ом, 2ом, 3ем и тд шагах соответственно
for i1 in xrange(1, 11):
    for i2 in xrange(1, 11):
        for i3 in xrange(1, 11):
            for i4 in xrange(1, 11):
                for i5 in xrange(1, 11):
                    win = 0
                    # j - начальное положение шарика
                    # pos1, pos2, pos3 и тд
                    # - положение шарика в начале 1ого, 2ого, 3его и тд хода
                    for j in xrange(1, 11):
                        pos1 = min(j + 0, 10)
                        pos2 = min(j + 1, 10)
                        pos3 = min(j + 2, 10)
                        pos4 = min(j + 3, 10)
                        pos5 = min(j + 4, 10)
                        if i1 == pos1 or i2 == pos2 or i3 == pos3\
                        or i4 == pos4 or i5 == pos5:
                            win += 1
                    if win == 10:
                        print i1, i2, i3, i4, i5
                        wins += 1
print wins


Решение в лоб для 6и попыток:

wins = 0
# i1, i2, i3 и тд - выбор стакана на 1ом, 2ом, 3ем и тд шагах соответственно
for i1 in xrange(1, 11):
    for i2 in xrange(1, 11):
        for i3 in xrange(1, 11):
            for i4 in xrange(1, 11):
                for i5 in xrange(1, 11):
                    for i6 in xrange(1, 11):
                        win = 0
                        # j - начальное положение шарика
                        # pos1, pos2, pos3 и тд
                        # - положение шарика в начале 1ого, 2ого, 3его и тд хода
                        for j in xrange(1, 11):
                            pos1 = min(j + 0, 10)
                            pos2 = min(j + 1, 10)
                            pos3 = min(j + 2, 10)
                            pos4 = min(j + 3, 10)
                            pos5 = min(j + 4, 10)
                            pos6 = min(j + 5, 10)
                            if i1 == pos1 or i2 == pos2 or i3 == pos3\
                            or i4 == pos4 or i5 == pos5 or i6 == pos6:
                                win += 1
                        if win == 10:
                            print i1, i2, i3, i4, i5, i6
                            wins += 1
print wins
Ответ написан
Комментировать