Compare commits

...

2 Commits

Author SHA1 Message Date
Zengtudor
4ccd04aeb3 feat: 添加P3959.cpp空文件 2025-10-04 11:53:02 +08:00
Zengtudor
25c16bcf5a feat: 添加P2540题解实现斗地主AI算法
实现基于深度优先搜索的斗地主出牌策略算法,包含单牌、对子、三带、顺子等多种牌型处理
2025-10-04 11:02:30 +08:00
2 changed files with 171 additions and 0 deletions

168
src/10/4/P2540.cpp Normal file
View File

@ -0,0 +1,168 @@
#include <algorithm>
#include <cstring>
#include <iostream>
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

3
src/10/4/P3959.cpp Normal file
View File

@ -0,0 +1,3 @@
int main(){
}