[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; }

__EOF__

本文作者PHarr
本文链接https://www.cnblogs.com/PHarr/p/18387485.html
关于博主:前OIer,SMUer
版权声明CC BY-NC 4.0
声援博主:如果这篇文章对您有帮助,不妨给我点个赞
posted @   PHarr  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示