NC236125. Rake It In
描述
设计师们想出了一个名为“Rake It In”的新简单游戏。两个玩家,Alice和Bob,最初选择一个整数 并初始化一个分数指示器。创建一个 的棋盘,棋盘上有 个值。从玩家 Alice 开始,一轮中的每个玩家选择棋盘的 区域,将该区域中的值的总和添加到得分指示器,然后将这四个值逆时针旋转 度。
在总共 轮之后,每个玩家做了 次决定。 Alice的最终目标是最大化最终得分。然而对于 Bob 来说,他的目标是最小化最终得分。
为了测试这个游戏有多好,你被雇来编写一个可以玩这个游戏的程序。具体来说,在给定起始配置的情况下,他们希望有一个程序在两个玩家都完全理性时确定最终得分。
输入描述
第一行提供一个整数 ,它是测试用例的数量。
每个案例包含五行。第一行提供整数 。
以下四行中的每一行都包含四个整数,指示板上最初的值。所有值都是 到 之间的整数。
输出描述
对于每组数据,输出一行表示答案。
示例1
输入:
4 1 1 1 2 2 1 1 2 2 3 3 4 4 3 3 4 4 2 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 3 1 1 4 4 4 4 1 1 1 1 4 4 1 4 1 4 3 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1
输出:
20 40 63 71
C++(g++ 7.5.0) 解法, 执行用时: 636ms, 内存消耗: 468K, 提交时间: 2023-05-06 11:46:48
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int mod=1e9+7; int n,m,k; int g[5][5]; void rot(int x,int y) { swap(g[x+1][y],g[x][y]); swap(g[x][y],g[x][y+1]); swap(g[x][y+1],g[x+1][y+1]); } int dfs(int u,bool flag) { if(u>=2*k) return 0; int res1=0,res2=1e9; for(int i=1;i<=3;i++) { for(int j=1;j<=3;j++) { int ans=g[i][j]+g[i][j+1]+g[i+1][j+1]+g[i+1][j]; rot(i,j); ans+=dfs(u+1,flag^1); res1=max(res1,ans); res2=min(res2,ans); rot(i,j),rot(i,j),rot(i,j); } } if(flag) return res1; else return res2; } void solve() { cin >> k; for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) scanf("%d",&g[i][j]); int res=dfs(0,1); printf("%d\n",res); } int main() { int _; cin >> _; while(_--) solve(); return 0; }
C++(clang++ 11.0.1) 解法, 执行用时: 487ms, 内存消耗: 508K, 提交时间: 2022-08-24 17:17:33
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;i++) #define sf(n) scanf("%d",&n) int a[5][5]; int k; int dfs(int sum,int n){ if(n==2*k) return sum; int Min=1e9,Max=0; rep(i,1,3){ rep(j,1,3){ int x; x=a[i][j],a[i][j]=a[i][j+1];a[i][j+1]=a[i+1][j+1];a[i+1][j+1]=a[i+1][j];a[i+1][j]=x; int temp=dfs(sum+a[i][j]+a[i+1][j]+a[i][j+1]+a[i+1][j+1],n+1); Max=max(Max,temp);Min=min(Min,temp); x=a[i+1][j];a[i+1][j]=a[i+1][j+1];a[i+1][j+1]=a[i][j+1];a[i][j+1]=a[i][j],a[i][j]=x; } } if(n%2) return Min; else return Max; } void solve(){ int t; sf(t); while(t--){ sf(k); rep(i,1,4){ rep(j,1,4){ sf(a[i][j]); } } cout<<dfs(0,0)<<endl; } } int main(){ solve(); return 0; }