1851: KILL
Time Limit: 1 Sec
Memory Limit: 128 MB
Submit: 27
Solved: 3
Submit Status Web Board
Description
众所周知,yjj发现了一款新型的益智卡牌游戏叫SGK,游戏的具体内容是这样的:
(1)游戏方式:
1.游戏玩家分为两人A和B,双方生命值均为3点且各拥有不超过9张的手牌。由玩家A主动出牌发起进攻,若玩家A能打败玩家B则算玩家A胜利,否则算玩家B胜利。
2.游戏内打出的卡牌即为从手牌中丢弃。
3.为了增加游戏的乐趣,双方的手牌均为互相可见。
PS:1.玩家被打败的条件是生命值降为0,且没有恢复生命值的卡牌了。
2.若玩家已被打败,则不能够再出牌。
(2)卡牌类型:
“杀”牌(K):
1.直接打出一张指向对方,若对方不能打出一张“闪”牌进行响应,则对方损失一点生命值。(本方法只能使用一次)
2.用来响应“南蛮入侵”牌。
3.用来响应“决斗”牌。
“闪”牌(S):
1.用来响应“万箭齐发”牌。
2.用来响应“杀”牌。
“桃”牌(T):
1.在生命值降为0的时候可自动打出,为该玩家恢复一点生命值。
“南蛮入侵”牌(N):
1.直接打出一张指向对方,若对方不能打出一张“杀”牌进行响应,则对方损失一点生命值。(本方法可以使用任意次)
“万箭齐发”牌(W):
1.直接打出一张指向对方,若对方不能打出一张“闪”牌进行响应,则对方损失一点生命值。(本方法可以使用任意次)
“决斗”牌(J):
1.直接打出一张指向对方,由对方开始双方轮流打出一张“杀”牌进行响应,直到其中一方不能够打出“杀”牌为止,则该方损失一点生命值。(本方法可以使用任意次)
PS:1.用来响应的方法可以使用任意次。
2.若有牌可以响应则必须打出响应。
今天yjj邀请JS和DZ来玩这个游戏,由JS作为玩家A,DZ作为玩家B。现在告诉你JS和DZ的手牌,聪明的你能告诉yjj谁能够胜利么?
Input
首先输入一个整数T,代表有T组测试实例。(1<=T<=100)
对于每组测试,输入包含三行,第一行包含两个整数n、m,分别代表JS的手牌数和DZ的手牌数。(0<=n,m<=9)
接下两行分别代表JS的牌型和DZ的牌型,牌型均为上述牌型括号内的大写字母,用空格隔开。
Output
对于每组测试实例,若JS胜利则输出“JS”,若DZ胜利则输出“DZ”(不带引号)。
Sample Input
24 1
K K K K
S
4 1
W W W W
S
Sample Output
DZJS
第一次提交总是wa,原因是使用卡牌的顺序。
下面总结一下:
1.消耗闪的牌有杀和万箭齐发。消耗杀的牌有决斗、南蛮入侵,闪的处理很简单,但是决斗会伤到自己,而且还包括了一个互相消耗杀的过程,所以,应该安排好使用的顺序。
2.根据第一条,此题分为两方面削血。第一是需要用闪应答的,第二是需要用杀应答的。二者的顺序又是一个问题,这里考虑到对方0闪的情况,应该先用万箭齐发和杀。
3.先说应答“闪”的牌的排序:万箭齐发和杀本来都是消耗一张闪的,然而杀一回合只有一次,所以应该先万箭齐发,后判断对方是不是有闪,有的话就没必要杀,留着决斗吧。
4.再说应答“杀”的牌的排序:决斗是快速消耗对方杀的好牌,一定是先用的,但是要考虑到自己生命值是1的情况,给自己玩死了就不好了。所以应该先决斗,再南蛮入侵,再决 斗。
个人吐槽:太好玩!
AC代码如下:
#include <stdio.h>
struct pai
{
int K;
int S;
int W;
int N;
int J;
int life;
};
int main()
{
int u;
int a,b; //手牌数
int life; //生命值
char t;
scanf ("%d",&u);
while (u--)
{
scanf ("%d %d",&a,&b);
struct pai JS={0};
struct pai DZ={0};
JS.life=3;
DZ.life=3;
getchar();
while (a--)
{
scanf ("%c",&t);
getchar();
if (t=='K')
JS.K++;
else if (t=='S')
JS.S++;
else if (t=='W')
JS.W++;
else if (t=='N')
JS.N++;
else if (t=='J')
JS.J++;
else if (t=='T')
JS.life++;
}
while (b--)
{
scanf ("%c",&t);
getchar();
if (t=='K')
DZ.K++;
else if (t=='S')
DZ.S++;
else if (t=='W')
DZ.W++;
else if (t=='N')
DZ.N++;
else if (t=='J')
DZ.J++;
else if (t=='T')
DZ.life++;
}
//万箭齐发
if (JS.W>0)
{
DZ.S-=JS.W;
}
if (DZ.S<0)
{
DZ.life+=DZ.S;
DZ.S=0;
}
//杀!
if (JS.K>0 && DZ.S<=0)
{
DZ.life--;
JS.K--;
}
//决斗
while (JS.J>0 && (JS.life>1 || JS.K>=DZ.K))
{
if (DZ.K!=0) //消耗双方的"杀"
{
while (DZ.K--)
{
if (JS.K==0)
{
JS.life--;
break;
}
else
{
JS.K--;
if (DZ.K==0)
{
DZ.life--;
break;
}
}
}
}
else
DZ.life--;
JS.J--;
}
//南蛮入侵
if (JS.N>0)
{
DZ.K-=JS.N;
}
if (DZ.K<0)
{
DZ.life+=DZ.K;
DZ.K=0;
}
//决斗
while (JS.J>0 && JS.K>=DZ.K)
{
if (DZ.K!=0) //消耗双方的"杀"
{
while (DZ.K--)
{
if (JS.K==0)
{
JS.life--;
break;
}
else
{
JS.K--;
if (DZ.K==0)
{
DZ.life--;
break;
}
}
}
}
else
DZ.life--;
JS.J--;
}
if (DZ.life<=0)
{
printf ("JS\n");
}
else
{
printf ("DZ\n");
}
}
return 0;
}