From 25c16bcf5a9a8fca8836d45c5b4412640da41d22 Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Sat, 4 Oct 2025 11:02:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0P2540=E9=A2=98?= =?UTF-8?q?=E8=A7=A3=E5=AE=9E=E7=8E=B0=E6=96=97=E5=9C=B0=E4=B8=BBAI?= =?UTF-8?q?=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现基于深度优先搜索的斗地主出牌策略算法,包含单牌、对子、三带、顺子等多种牌型处理 --- src/10/4/P2540.cpp | 168 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 src/10/4/P2540.cpp diff --git a/src/10/4/P2540.cpp b/src/10/4/P2540.cpp new file mode 100644 index 0000000..31aacab --- /dev/null +++ b/src/10/4/P2540.cpp @@ -0,0 +1,168 @@ +#include +#include +#include + +int n; +int cnts[20]; +int ans; + +int to_rank(int a, int b) { + if (a == 0) + return 16 + b - 1; + if (a == 1) + return 14; + if (a == 2) + return 15; + return a; +} + +void dfs(int moves) { + if (moves >= ans) { + return; + } + bool empty = true; + for (int i = 3; i <= 17; ++i) { + if (cnts[i] > 0) { + empty = false; + break; + } + } + if (empty) { + ans = std::min(ans, moves); + return; + } + + for (int len = 12; len >= 5; --len) { + for (int i = 3; i <= 14 - len + 1; ++i) { + bool pos = true; + for (int k = i; k < i + len; ++k) { + if (cnts[k] == 0) { + pos = false; + break; + } + } + if (pos) { + for (int k = i; k < i + len; ++k) + cnts[k]--; + dfs(moves + 1); + for (int k = i; k < i + len; ++k) + cnts[k]++; + } + } + } + + for (int len = 10; len >= 3; --len) { + for (int i = 3; i <= 14 - len + 1; ++i) { + bool pos = true; + for (int k = i; k < i + len; ++k) { + if (cnts[k] < 2) { + pos = false; + break; + } + } + if (pos) { + for (int k = i; k < i + len; ++k) + cnts[k] -= 2; + dfs(moves + 1); + for (int k = i; k < i + len; ++k) + cnts[k] += 2; + } + } + } + + for (int len = 6; len >= 2; --len) { + for (int i = 3; i <= 14 - len + 1; ++i) { + + } + } + + for (int i = 3; i <= 15; ++i) { + if (cnts[i] >= 3) { + for (int k = 3; k <= 17; ++k) { + if (k != i && cnts[k] >= 1) { + cnts[i] -= 3; + cnts[k] -= 1; + dfs(moves + 1); + cnts[i] += 3; + cnts[k] += 1; + } + } + } + + if (cnts[i] >= 3) { + for (int k = 3; k <= 15; ++k) { + if (k != i && cnts[k] >= 2) { + cnts[i] -= 3; + cnts[k] -= 2; + dfs(moves + 1); + cnts[i] += 3; + cnts[k] += 2; + } + } + } + + if (cnts[i] >= 4) { + + } + + if (cnts[i] >= 4) { + + } + } + + if (cnts[16] > 0 && cnts[17] > 0) { + cnts[16]--; + cnts[17]--; + dfs(moves + 1); + cnts[16]++; + cnts[17]++; + } + + for (int i = 3; i <= 17; ++i) { + if (cnts[i] >= 4) { + cnts[i] -= 4; + dfs(moves + 1); + cnts[i] += 4; + } + if (cnts[i] >= 3) { + cnts[i] -= 3; + dfs(moves + 1); + cnts[i] += 3; + } + if (cnts[i] >= 2) { + cnts[i] -= 2; + dfs(moves + 1); + cnts[i] += 2; + } + if (cnts[i] >= 1) { + cnts[i] -= 1; + dfs(moves + 1); + cnts[i] += 1; + } + } +} + +void solve() { + std::cin >> n; + memset(cnts, 0, sizeof(cnts)); + for (int i = 0; i < n; ++i) { + int a, b; + std::cin >> a >> b; + cnts[to_rank(a, b)]++; + } + + ans = n; + dfs(0); + std::cout << ans << "\n"; +} + +int main() { + std::ios_base::sync_with_stdio(false); + std::cin.tie(NULL); + int T; + std::cin >> T >> n; + while (T--) { + solve(); + } +} +// TODO to done \ No newline at end of file