Just another board game(博弈)

题面Just another board game

题意:Roundgod和kimoyami在玩一个棋盘游戏,棋盘大小为n*m,每个格子有a[i][j]的价值,最开始的位置在(1,1),Roundgod与kimoyami轮流走(Roundgod先走),Roundgod只能横着走(走任意格),kimoyami只能竖着走(走任意格),两人最多走的步数为k(也可以在到某人走时不走而选择终止游戏),Roundgod想要使最终到达的格子的值最大,kimoyami想要使最终到达的格子的值最小,如果两个玩家都选择了最佳策略,求游戏的最终价值。

分析:样例太水,自己随便造几组就会知道,当k为奇数时,最优解即最小的每行的最大值;当k为偶数时,最优解即最大的每列的最小值。另外,当k==1时,找第一行的最大值即可。最后注意可在任意时刻结束游戏,Roundgod已知走完k步的最优值,只需与a[1][1]比较(是否在第一步终止游戏),最后输出大的那个即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int inf=1e9;
vector<vector<int>>v;//用数组存不下 

int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,m;
		ll k;
		scanf("%d%d%lld",&n,&m,&k);
		v.resize(n);//前n个元素清空 
		for(int i=0;i<n;i++)
		{
			v[i].resize(m);
			for(int j=0;j<m;j++)
			{
				scanf("%d",&v[i][j]);
			}
		}
		if(k==1)
		{
			int maxx=0;
			for(int i=0;i<m;i++)
			{
				maxx=max(maxx,v[0][i]);
			}
			printf("%d\n",maxx);
		}
		else if(k%2==0)
		{
			int maxx=0;
			for(int i=0;i<m;i++)
			{
				int minn=inf;
				for(int j=0;j<n;j++)
				{
					minn=min(minn,v[j][i]);
				}
				maxx=max(maxx,minn);
			}
			printf("%d\n",max(maxx,v[0][0]));
		}
		else
		{
			int minn=inf;
			for(int i=0;i<n;i++)
			{
				int maxx=0;
				for(int j=0;j<m;j++)
				{
					maxx=max(maxx,v[i][j]);
				}
				minn=min(minn,maxx);
			}
			printf("%d\n",max(minn,v[0][0]));
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chmpy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值