Jericho | Дата: Среда, 05 Августа 2015, 18:18 | Сообщение # 1 |
Ubuntu 11.10 user
Сейчас нет на сайте
| Доброго времени суток. Пишу в Builder 2006 покер на костях. Итого есть 5 переменных со значениями (от 1 до 6). Нужна помощь в написании алгоритма поиска комбинации. Могут быть следующие комбинации
Уютненькая страничка Ерихона
xxx: Так вы представляете, у него там фрагмент кода в 15 строк повторяется 37 раз. Если вынести в функцию можно сэкономить полтыщи строк! yyy: это припев. © Антон Антоненко
|
|
| |
Gudleifr | Дата: Среда, 05 Августа 2015, 21:00 | Сообщение # 2 |
почти ветеран
Сейчас нет на сайте
| Алгоритм решения задачи не имеет отношения к языку C++. Т.е. сначала решаете на бумажке (на своем языке), и только потом переводите в C++.
Смешивать все в одну кучу - болезнь этого Форума. Что, теперь так учат?
Добавлено (05 августа 2015, 18:38) --------------------------------------------- P.S. Как решать "на своем зыке"? Очевидно. Вот, перед Вами 5 костей... Как Вы решаете, сколько выпало?
P.P.S. К настоящим костям эта задача относится слабо: там надо решить две гораздо более сложные задачи: о выборе самой выгодной комбинации при текущем броске и о перебросе.
Добавлено (05 августа 2015, 21:00) --------------------------------------------- Воспользуюсь этим случаем для иллюстрации золотого правила кодинга: 1. Лучше всего нужную штуку просто вычислить. 2. Если ее нельзя просто вычислить, используй таблицы. 3. Если таблица не получается, используй if-ы и switch-и.
Сформулируем задачу: на входе массив (A) из 5 6-значных цифр, на выходе - три числа: приоритет комбинации (С), большее число в комбинации (F), второе число в кобинации (S).
1. Возможно ли "вычислить эти три числа"? Разумеется. Составим таблицу 6*6*6*6*6 => S*F*S. Не такая уж и большая таблица - всего 7776 записей.
Можно соптимизировать по размеру, убрав перестановки и заменив "5 значений" на "6 счетчиков". После чего рассматривать эту таблицу как список, из которого можно вычеркивать при каждом броске кубика те записи, у которых нужный счетчик уже обнулен. Через 5 бросков останется единственная запись.
2. Рассмотрим "табличное" решение. Его схема будет выглядеть так: A(5) => B(6) /счетчики/ => К(7) /комбинации/
A=>B очевидно: для каждого I из промежутка 1-5 увеличить B(A(I)) на единицу.
Теперь подготовим массив К /C=>F,S/ 1 /5/: 0 0 2 /4/: 0 0 3 /32/: 0 0 4 /3/: 0 0 5 /22/: 0 0 6 /2/: 0 0 7 /1/: 0 0 8: 0 0
И соответственно, переходник от B к К (X) 0: 8 1: 7 2: 6 3: 4 4: 2 5: 1
Тогда от B можно перейти к К так:
Для каждого I из промежутка 1-6: K(X(B(I)),2) = K(X(B(I)),1); K(X(B(I)),1) = I; C = min(С,X(B(I))
Если C=4 и К(б,1), C=3, K(3,1)=K(4,1) K(3,2)=K(6,1). Если C=6 и К(б,2), C=5, K(5,1)=K(6,1) K(5,2)=K(6,2).
3. Логика? Нет уж, это без меня. Можете сами, если хотите.
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
Сообщение отредактировал Gudleifr - Среда, 05 Августа 2015, 21:47 |
|
| |