DUToj1228: Pokémon battle(极大极小值搜索)

1228: Pokémon battle

Time Limit:6000/4000 MS (Java/Others)   Memory Limit:294912/262144 KB (Java/Others)
Total Submissions:14   Accepted:6

[Submit][Status][Discuss]

Description

有一天大哥和老仙觉得暴雪游戏都太SB了,于是投入了破壳萌的怀抱。为了提高节目效果,大哥和老仙玩起了破壳萌双打,并赌上十顿日料。

大哥有两只破壳萌,编号为1,2,攻击力分别为Atk1Atk1和Atk2Atk2,血量分别为HP1HP1和HP2HP2。老仙也有两只破壳萌,编号为3,4,攻击力分别为Atk3Atk3和Atk4Atk4,血量分别为HP3HP3和HP4HP4。

破壳萌每次攻击时会攻击对方的一只破壳萌,被攻击的破壳萌血量会减去发动攻击的破壳萌的攻击数值。如果一只破壳萌的血量小于等于0,那么它就会倒下,无法再发动攻击。

每轮游戏4只破壳萌会相继发动攻击,行动顺序为1,2,3,4(当然已经倒下的不会再攻击了)。如果某次攻击之后有一方的两只破壳萌全部倒下了,那么游戏将结束,两只都倒下的一方将输掉这次战斗。

因为大哥和老仙的智力都高达1000no,因此他们都会采用最佳策略。而你——需要计算谁会赢得这场胜利,这样就可以靠某鱼的竞猜赢得鱼丸。

本题数据组数:10。

Input

第一行包括一个整数q(1≤q≤10)q(1≤q≤10),代表数据组数。

接下来qq行,每行8个整数,分别代表Atk1,HP1,Atk2,HP2,Atk3,HP3,Atk4,HP4(1≤HPi,Atki≤50)Atk1,HP1,Atk2,HP2,Atk3,HP3,Atk4,HP4(1≤HPi,Atki≤50)。

Output

 对于每组测试数据,输出一行。如果大哥会赢得胜利,输出“BigBrotherV5”,否则输出“GanSiHuangXuDong”。

Sample Input

2
1 1 1 1 1 2 1 1
1 1 1 1 1 2 1 2

Sample Output

BigBrotherV5
GanSiHuangXuDong

HINT

 

Source

Zeratul

[Submit][Status][Web Board]

 

题意:有两个人共有4个 神奇宝贝,两人足够聪明判断是否先手必胜。

思路:极大极小值搜索假如当前状况先手有一种可能赢先手就赢了,同理一层层搜索下去,最多只需要记录50*50*50*50个状态就能结束。

代码:

#include <bits/stdc++.h>
using namespace std;
int vis[51][51][51][51];
int a[51][51][51][51];
int hp[10];int ak[10];
int mins(int hp1,int hp2,int hp3,int hp4);
int maxs(int hp1,int hp2,int hp3,int hp4)
{
	if(hp1<0) hp1=0;if(hp2<0) hp2=0;if(hp3<0) hp3=0;if(hp4<0) hp4=0;int ans=0;
	
	if(vis[hp1][hp2][hp3][hp4]!=0)
	{
		return a[hp1][hp2][hp3][hp4];
	}
	if(!hp3&&!hp4)
	{
		a[hp1][hp2][hp3][hp4]=vis[hp1][hp2][hp3][hp4]=1;
		return 1;
	}
	if(!hp1&&!hp2);
	else if(!hp1&&hp2)
	{
	if(hp3) ans|=mins(hp1,hp2,hp3-ak[2],hp4);if(hp4) ans|=mins(hp1,hp2,hp3,hp4-ak[2]);
	}
	else if(hp1&&!hp2)
	{
	if(hp3) ans|=mins(hp1,hp2,hp3-ak[1],hp4);if(hp4) ans|=mins(hp1,hp2,hp3,hp4-ak[1]);
	}
	else
	{
	if(hp3) ans|=mins(hp1,hp2,hp3-ak[1]-ak[2],hp4);if(hp4) ans|=mins(hp1,hp2,hp3,hp4-ak[1]-ak[2]);
	if(hp3&&hp4)
	{
	ans|=mins(hp1,hp2,hp3-ak[2],hp4-ak[1]);ans|=mins(hp1,hp2,hp3-ak[1],hp4-ak[2]);			
	}
	}
	vis[hp1][hp2][hp3][hp4]=1;
	a[hp1][hp2][hp3][hp4]=ans;
	return  a[hp1][hp2][hp3][hp4];	
}

int mins(int hp1,int hp2,int hp3,int hp4)
{

	if(hp1<0) hp1=0;if(hp2<0) hp2=0;if(hp3<0) hp3=0;if(hp4<0) hp4=0;int ans=1;
	
	if(!hp3&&!hp4)	return 1;	if(!hp1&&!hp2)	return 0;
	if(hp3&&!hp4){
		if(hp1) ans&=maxs(hp1-ak[3],hp2,hp3,hp4);if(hp2) 	ans&=maxs(hp1,hp2-ak[3],hp3,hp4);
	}
	if(!hp3&&hp4){
	if(hp1) 	ans&=maxs(hp1-ak[4],hp2,hp3,hp4);	if(hp2) ans&=maxs(hp1,hp2-ak[4],hp3,hp4);
	}
	if(hp3&&hp4){
	if(hp1) 	ans&=maxs(hp1-ak[3]-ak[4],hp2,hp3,hp4);	if(hp2)  ans&=maxs(hp1,hp2-ak[3]-ak[4],hp3,hp4);
	if(hp1&&hp2) 
	{
		ans&=maxs(hp1-ak[3],hp2-ak[4],hp3,hp4);	ans&=maxs(hp1-ak[4],hp2-ak[3],hp3,hp4);		
	}
	}
	return ans;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		memset(vis,0,sizeof(vis));int aans;
		scanf("%d%d%d%d%d%d%d%d",&ak[1],&hp[1],&ak[2],&hp[2],&ak[3],&hp[3],&ak[4],&hp[4]);
		if(maxs(hp[1],hp[2],hp[3],hp[4]))
		{
			printf("BigBrotherV5\n");
		}
		else{
			printf("GanSiHuangXuDong\n");	
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值