列表

详情


NC236125. Rake It In

描述

设计师们想出了一个名为“Rake It In”的新简单游戏。两个玩家,Alice和Bob,最初选择一个整数 k 并初始化一个分数指示器。创建一个 的棋盘,棋盘上有 16 个值。从玩家 Alice 开始,一轮中的每个玩家选择棋盘的 区域,将该区域中的值的总和添加到得分指示器,然后将这四个值逆时针旋转 90 度。

在总共 2k 轮之后,每个玩家做了 k 次决定。 Alice的最终目标是最大化最终得分。然而对于 Bob 来说,他的目标是最小化最终得分。

为了测试这个游戏有多好,你被雇来编写一个可以玩这个游戏的程序。具体来说,在给定起始配置的情况下,他们希望有一个程序在两个玩家都完全理性时确定最终得分。

输入描述

第一行提供一个整数 ,它是测试用例的数量。

每个案例包含五行。第一行提供整数

以下四行中的每一行都包含四个整数,指示板上最初的值。所有值都是 110 之间的整数。

输出描述

对于每组数据,输出一行表示答案。

示例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;
}

上一题