1228: Pokémon battle
Time Limit:6000/4000 MS (Java/Others) Memory Limit:294912/262144 KB (Java/Others)
Total Submissions:14 Accepted:6
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
题意:有两个人共有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");
}
}
}