Цитата (БиллиУбили @ 26.3.2019)
1. кол-во определения комбинаций из 5 карт(с начислением очков) доведено до 50К за 1 сек
Забирай массив со всеми посчитанными пятерками карт. С(52,5). Пишу на Delphi, возможно различие по синтаксису.
Массив одномерный. Загружаешь его в память, размер массива HR5 : array [0..5720182-1] of integer; всего 5720182 - 32бит чисел. В массиве есть все 2598960 комбинаций.
Карты отсортированы в колоде так: 2,3,4,5,6...J,Q,K,A, 2,3,4,5,6... , т.е. вначале одна масть, потом вторая и т.д. (есть формат сортировки колоды 2,2,2,2,3,3,3,3,4,4,4,4,...). Первая 2-ка=0, 3-ка=1, А = 12, и т.д.
Поиск силы комбинации из 5 карт (c1,c2,c3,c4,c5), порядок произвольный, ответ будет одинаковый:
function GetHR5(c1,c2,c3,c4,c5:integer):integer; begin result := HR5[ HR5[ HR5[ HR5[ HR5[53+c1]+c2]+c3]+c4]+c5]; end; // delphi
Силу разных комб можно сравнивать на поиск лучшей.
Формат result: $0x0yyyyy -
x - комбинация из
HANDTYPE_VALUE_ROYALFLUSH: Cardinal = $09000000;
HANDTYPE_VALUE_STRAIGHTFLUSH: Cardinal = $08000000;
HANDTYPE_VALUE_FOUR_OF_A_KIND: Cardinal = $07000000;
HANDTYPE_VALUE_FULLHOUSE: Cardinal = $06000000;
HANDTYPE_VALUE_FLUSH: Cardinal = $05000000;
HANDTYPE_VALUE_STRAIGHT: Cardinal = $04000000;
HANDTYPE_VALUE_TRIPS: Cardinal = $03000000;
HANDTYPE_VALUE_TWOPAIR: Cardinal = $02000000;
HANDTYPE_VALUE_PAIR: Cardinal = $01000000;
HANDTYPE_VALUE_HIGHCARD: Cardinal = $00000000;
yyyyy - пять кикеров комбинации для сравнения.
т.е. старшие 8 бит - комбинация (стрит, пара, тройка и т.д.), младшие 20 бит - кикеры для сравнения двух комб.
Есть такое же для 3 карт.
Массив HR3 : array [0..73137-1] of cardinal;
обращение
function GetHR3(c1,c2,c3:integer):integer; begin result := HR3[ HR3[ HR3[53+c1]+c2]+c3]; end;
HandRanks3.datHandRanks5.datСкорость приятно удивит, у меня несколько млн/сек.
идея оказалась нерабочей. Перебор-то полный, мы рано или поздно положим фантазию в топ(виртуальные очки превратятся в настоящие), поэтому забегать "вперёд" и что-то там считать отдельно(от перебора) бессмысленно. Это раз. Во-вторых, знание о том, что какой-то "ход" даёт -4 к ЕВ не имеет практического смысла. Существует вероятность, что все остальные "хода" - на "-6" очков, поэтому отбросить ход на -4 не удастся(он будет самым лучшим).
Поэтому думаю развить идею со стоп-листами. Как только в топе оказывается комбинация QQ+ -> активировать стоп-листы на мидл. И сразу, по правилу уменьшению старшинства комбинаций, и на нижнюю линию.
ЗЫ Проблема неразличения комбинаций типа и безусловно существует(за них дают одинаковое кол-во очков), но до неё пока далеко