手牌 5 張,牌堆頂 5 張(已知順序)。可棄掉手中 0~5 張,從牌堆頂補同等張數。目標:最終 5 張牌牌型等級最高。輸出最佳牌型名稱。
struct Card { char str[3]; } hand[10], deck[10], best[10];
// 點數映射:A=1, 2-9, T=10, J=11, Q=12, K=13
// 為便於比較,轉換為可排序字符:'1'..'9', ':', ';', '<', '='
void convert(Card *c) {
switch (c->str[0]) {
case 'A': c->str[0] = '1'; break;
case 'T': c->str[0] = ':'; break;
case 'J': c->str[0] = ';'; break;
case 'Q': c->str[0] = '<'; break;
case 'K': c->str[0] = '='; break;
}
}
// 按點數排序
int cmp(const void *a, const void *b) {
return ((Card*)a)->str[0] - ((Card*)b)->str[0];
}
void dfs(int idx, int kept) {
if (idx == 5) { // 5 張手牌決策完畢
// 從牌堆補齊 (5 - kept) 張
for (int i = 0; i < 5 - kept; i++)
best[kept + i] = deck[i];
qsort(best, 5, sizeof(Card), cmp);
int rank = judge_hand();
max_rank = max(max_rank, rank);
return;
}
// 選擇 1:保留手牌 idx
best[kept] = hand[idx];
convert(&best[kept]);
dfs(idx + 1, kept + 1);
// 選擇 2:棄掉手牌 idx
dfs(idx + 1, kept);
}
int judge_hand() {
// 統計點數出現次數 num1[]、花色出現次數 num2[]
// 同花順:連續 5 點數 + 同花色
// 四條:任意點數出現 4 次
// 葫蘆:3+2 分佈
// 同花:花色出現 5 次
// 順子:連續 5 點數(含 A-2-3-4-5 輪轉)
// 三條:任意點數出現 3 次
// 兩對:兩個點數各出現 2 次
// 一對:任意點數出現 2 次
// 高牌:以上皆非
}