[2017 ICPC Nanning] Rake It In
https://ac.nowcoder.com/acm/contest/32183/A
一个很有意思的搜索,先手希望结果尽可能的大,后手希望结果尽可能的小。所以在枚举的时候,先后手的策略是不一样的。
#include <bits/stdc++.h>
using namespace std;
using i32 = int32_t;
using i64 = long long;
using ldb = long double;
const i32 inf = INT_MAX / 2;
const i64 INF = LLONG_MAX / 2;
#define int i64
using vi = vector<int>;
int a[4][4], k;
int query(int x, int y) {
return a[x][y] + a[x + 1][y] + a[x][y + 1] + a[x + 1][y + 1];
}
void change1(int x, int y) {
swap(a[x][y], a[x][y + 1]);
swap(a[x][y + 1], a[x + 1][y + 1]);
swap(a[x + 1][y], a[x + 1][y + 1]);
}
void change2(int x, int y) {
swap(a[x][y], a[x][y + 1]);
swap(a[x][y], a[x + 1][y]);
swap(a[x + 1][y], a[x + 1][y + 1]);
}
int dfs(int i) {
if (i == k) return 0;
if (i & 1) {
int res = inf;
for (int x = 0; x < 3; x++)
for (int y = 0; y < 3; y++) {
change1(x, y);
res = min(res, dfs(i + 1) + query(x, y));
change2(x, y);
}
return res;
} else {
int res = -inf;
for (int x = 0; x < 3; x++)
for (int y = 0; y < 3; y++) {
change1(x, y);
res = max(res, dfs(i + 1) + query(x, y));
change2(x, y);
}
return res;
}
}
void solve() {
cin >> k, k *= 2;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
cin >> a[i][j];
cout << dfs(0) << "\n";
}
i32 main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int T;
cin >> T;
while (T--)
solve();
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验