Щоб доповнити чудові відповіді, які це питання вже отримало, я подумав, що було б корисно запропонувати один із найпростіших способів порівняння рук після використання базової методики класифікації. Перш за все, вам захочеться позначити руки своїм класом , як підказують численні відповіді - більшість ваших зіставлень "рука X краще, ніж рука Y?" тоді це можна зробити, просто порівнявши класи двох рук і побачивши, який клас кращий. Для решти вам потрібно буде порівнювати на основі картки за карткою, і виявиться, що трохи більше роботи з класифікацією полегшить це.
В якості базового випадку розглянемо ситуацію, коли обидві руки - це руки з високою картою; у цьому випадку ви спершу порівняєте дві найвищі карти, потім (якщо вони збігаються) наступні дві карти тощо. Якщо ви вважаєте, що кожна вхідна рука сортована від найвищої до найнижчої карти, такий підхід призводить до коду, який виглядає як це:
int CompareHandsOfSameClass(Hand h1, Hand h2) {
for ( int i = 0; i < 5; i++ ) {
if ( h1[i].rank > h2[i].rank ) {
return -1;
} else if ( h1[i].rank < h2[i].rank ) {
return 1;
}
}
return 0;
}
Тепер хороша новина: виявляється, що це лексикографічне впорядкування , відповідним чином підроблене, працює для порівняння двох рук у будь-якійкласів, якщо їх клас однаковий. Наприклад, оскільки спосіб порівняння пар полягає в тому, щоб спершу порівняти пари, то з іншими трьома картами ви можете відсортувати руку, щоб спочатку поставити пару (або навіть одну карту пари спочатку!) Та запустити це те саме порівняння. (Так, наприклад, рука, схожа на A9772, зберігатиметься як 77A92 або, ще краще, 7A927; рука A9972 зберігатиметься як 9A729, і порівнюючи з наведеним вище кодом, ви почали б, поставивши 7 проти 9, і виявите, що A9972 виграв). Рука з двох пар буде зберігатися спочатку з вищою з двох пар, потім з нижньою, потім з «кікеркою» (так, наприклад, A9977 зберігатиметься як 97A97); три види зберігатимуться з однією картою з трьох перших, потім кикерів, потім інших карт (наприклад, A7772 буде 7A277); повний будинок зберігався б з одним із трьох, а потім одним із двох (наприклад, 99777 зберігався б як 79779); і прямі, і рум'янці можуть бути збережені в прямому лексикографічному порядку, оскільки вони обидва порівнюються так само, як і руки з високою картою. Це призводить до прямої функції зовнішнього компаратора, яка працює для всіх класів рук з уже заданою функцією:
// Compare two hands, returning -1/0/+1 as hand 1 is less than, equal to,
// or greater than hand 2. Note that this function assumes the hands have
// already been classified and sorted!
int CompareHands(Hand h1, Hand h2) {
if ( h1.handClass > h2.handClass ) {
return -1;
} else if ( h1.handClass < h2.handClass ) {
return 1;
} else {
return CompareHandsOfSameClass(h1, h2);
}
}
Сподіваємось, це допоможе!