Задать вопрос
@VPank
Бессмертие ради знаний. Знания ради бессмертия.

Через что решать задачу про шахматную доску?

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

UPD 1: не программным кодом. Интересует математическая/расчётная сторона. По какой схеме использования формул пойти?
Изначальная мысль в голове такая. Рассчитать количество всех возможных комбинаций расположения фигур. От них отнять те комбинации где парные фигуры одного цвета взаимозаменяют позиции друг друга. Далее отнять тоже самое но с пешками. Получаем общее число возможных комбинаций. Далее от этого числа отнимаем все вероятности при которых у ладьи на пути не встречаются фигуры. Соответственно со всеми видами комбинаций остальных фигур. После все отнимаем все вероятности, где путь ладье к королю преграждает другая фигура.
Как то так.
Но есть подозрение, что это слишком сложный путь и всё намного проще.
  • Вопрос задан
  • 758 просмотров
Подписаться 3 Средний 9 комментариев
Пригласить эксперта
Ответы на вопрос 2
Beshere
@Beshere
Разработчик
Можно решить, смоделировав ситуацию.

1. Пишите процедуру, которая умеет расставлять фигуры случайным образом.

2. Пишите функцию, которая на входе получает позицию на доске, проверяет под ударом ли король от вражеской ладьи и возвращает да/нет.

3. Запускаете цикл, который запускает процедуру 1 и проверяет условие функцией 2. При увеличении количества итераций число = Да/Все будет стремиться к некоему числу, которое и будет ответом.
Ответ написан
longclaps
@longclaps
discount, p = [1., 1.], 1. - 29. / 61.
for dist in range(1, 7):
    discount.append(discount[-1] * p)
discount += discount[-2:-8:-1]

res, cnt = 0., 0
for king in range(64):
    for rook1 in range(64):
        for rook2 in range(64):
            if king == rook1 or king == rook2 or rook1 == rook2:
                continue
            cnt += 1
            kingx, kingy = divmod(king, 8)
            rook1x, rook1y = divmod(rook1, 8)
            rook2x, rook2y = divmod(rook2, 8)
            attac1hor = 1. if kingy == rook1y else 0.
            attac1ver = 1. if kingx == rook1x else 0.
            attac2hor = 1. if kingy == rook2y else 0.
            attac2ver = 1. if kingx == rook2x else 0.
            if kingx == rook1x == rook2x:
                if kingy < rook1y < rook2y or kingy > rook1y > rook2y:
                    attac2ver = 0.
                elif kingy < rook2y < rook1y or kingy > rook2y > rook1y:
                    attac1ver = 0.
            elif kingy == rook1y == rook2y:
                if kingx < rook1x < rook2x or kingx > rook1x > rook2x:
                    attac2hor = 0.
                elif kingx < rook2x < rook1x or kingx > rook2x > rook1x:
                    attac1hor = 0.
            attac1 = attac1hor * discount[kingx - rook1x] + attac1ver * discount[kingy - rook1y]
            attac2 = attac2hor * discount[kingx - rook2x] + attac2ver * discount[kingy - rook2y]
            res += attac1 + attac2 - attac1 * attac2
print(res / cnt * 2.)


итого 0.3756044599826443
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы