Статья Автор: Лебедев Дмитрий

TUZ_2-13 Достижение стабильного состояния в болгарском пасьянсе

TUZ_2-13 Достижение стабильного состояния в болгарском пасьянсе

TUZ_2-13 Достижение стабильного состояния в болгарском пасьянсе
2.13 Достижение стабильного состояния в болгарском пасьянсе
В этой задаче дается список из n карт, представленных положительными целыми числами.
Цель состоит в том, чтобы продолжать генерировать новые списки чисел, отличающиеся от исходного,
пока не будет достигнуто стабильное состояние. Под стабильным состоянием понимается ситуация,
когда новый список содержит те же элементы, что и предыдущий список, но сами элементы могут быть упорядочены иначе.
При генерировании новых списков применяются два правила:
1) сумма чисел в списке должна быть равна треугольному числу (треугольные числа определяются согласно формуле 2.6);
 \(\frac{k\times(k+1)}{2};\ \ \ \ \ \ \ \ \ \ \ \ (2.6)\)
2) при создании нового списка на каждом этапе из всех чисел вычитается одна единица, а последним элементом списка становится длина предыдущего списка. Если результат вычитания равен нулю, он удаляется.
Этот процесс повторяется до тех пор, пока не будет достигнуто стабильное состояние.
Таким образом задача требует найти список, удовлетворяющий обоим условиям.
Этот процесс называется болгарским пасьянсом.
Например, подсчитаем количество шагов для достижения стабильного состояния для [3] – заданного списка чисел и k = 2.
  • Сначала необходимо проверить, равно ли треугольное число сумме элементов данного списка: k × (k + 1)/2 → 2 × (2 + 1)/2 = 3, т. е. 3 = 3.
  • Следующие шаги показывают, как достигается стабильное состояние: [3] → [2, 1] → [1, 2, 0] → [1, 2].
  • Поскольку элементы [2, 1] и [1, 2] равны, можно считать, что стабильное состояние достигнуто,
    даже притом что элементы в списках [2,1] и [1, 2] упорядочены по-разному.
    Поэтому стабильное состояние достигается уже после одного шага.
Ваша задача: написать функцию, которая принимает список из n положительных целых чисел и треугольное число
и возвращает количество шагов, необходимых для достижения стабильного состояния.
В табл. 2.13 показаны ожидаемые результаты для некоторых входных данных.
Таблица 2.13. Некоторые ожидаемые результаты для задачи подсчета шагов, необходимых для достижения стабильного состояния 
Points, k Ожидаемый результат
3
2
1
3, 7, 8, 14
4
0
10, 10, 10, 10, 10, 5
10
74
3000, 2050
100
7325

Один из важнейших шагов в решении этой задачи – правильное определение момента стабилизации.
Для этого нужно отсортировать текущий список и сравнить его с предыдущим.
Если два списка совпадают, то это указывает, что стабильное состояние достигнуто.
Однако, несмотря на кажущуюся простоту, этот подход может быть очень сложным.
Для определения состояния (стабильного или нет) используются два алгоритма:
  • is_stable_state
  • и Stable_State_in_Bulgarian_Solitaire.
Алгоритм
.Алгоритм Stable_State_in_Bulgarian_Solitaire выполняет следующие шаги.
  1.  Принимает два аргумента: points (список положительных целых чисел) и k (целое число).
     Инициализирует переменную number_of _moves значением 0.
  2.  Вычисляет сумму чисел во входном списке по формуле  k ∗ (k + 1)//2 и сохраняет ее в переменной equation.
  3.  Вызывает алгоритм is_stable_state, который принимает два аргумента:
    points (список положительных целых чисел) и k (целое число).
  4.  Сравнивает сумму чисел в списке points со значением equation.
    ???????Если они не равны, то возвращает ноль, чтобы сообщить, что стабильное состояние пока не достигнуто.
    Пока стабильное состояние не будет достигнуто, выполняется следующий цикл:
  •  из каждого элемента в списке points вычитается 1;
  •  из списка points удаляются все нулевые значения;
  •  в конец списка points добавляется элемент с длиной текущего списка точек;
  •  переменная number_of _moves увеличивается на 1;
  •  проверяется стабильность текущего состояния с использованием алгоритма is_stable_state.
5. Возвращает конечное значение number_of _moves.
6. Алгоритм is_stable_state выполняет следующие шаги.
7. Принимает два аргумента: points (список целых положительных чисел) и k (целое число).
8. Создает массив count с k+1 нулями.
9. Перебирает в цикле значения p в списке points и увеличивает соответствующий элемент в count, если p меньше или равно k.
10. Перебирает элементы в массиве count и сравнивает каждый c 1. Если встречается элемент, не равный 1, то возвращается False, указывающее, что состояние нестабильно.
11. Если цикл завершается без возврата False, то возвращается True, указывающее, что состояние стабильно.


Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать