【郑轻oj】1851-KILL(三国杀,贪心)(好玩!)

1851: KILL

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 27   Solved: 3

Submit Status Web Board

Description

众所周知,yjj发现了一款新型的益智卡牌游戏叫SGK,游戏的具体内容是这样的:

1)游戏方式:

1.游戏玩家分为两人AB,双方生命值均为3点且各拥有不超过9张的手牌。由玩家A主动出牌发起进攻,若玩家A能打败玩家B则算玩家A胜利,否则算玩家B胜利。

2.游戏内打出的卡牌即为从手牌中丢弃。

3.为了增加游戏的乐趣,双方的手牌均为互相可见。

PS1.玩家被打败的条件是生命值降为0,且没有恢复生命值的卡牌了。

    2.若玩家已被打败,则不能够再出牌。

2)卡牌类型:

“杀”牌(K):

1.直接打出一张指向对方,若对方不能打出一张“闪”牌进行响应,则对方损失一点生命值。(本方法只能使用一次)

2.用来响应“南蛮入侵”牌。

3.用来响应“决斗”牌。

“闪”牌(S):

1.用来响应“万箭齐发”牌。

2.用来响应“杀”牌。

“桃”牌(T):

1.在生命值降为0的时候可自动打出,为该玩家恢复一点生命值。

“南蛮入侵”牌(N):

1.直接打出一张指向对方,若对方不能打出一张“杀”牌进行响应,则对方损失一点生命值。(本方法可以使用任意次)

“万箭齐发”牌(W):

1.直接打出一张指向对方,若对方不能打出一张“闪”牌进行响应,则对方损失一点生命值。(本方法可以使用任意次)

“决斗”牌(J):

1.直接打出一张指向对方,由对方开始双方轮流打出一张“杀”牌进行响应,直到其中一方不能够打出“杀”牌为止,则该方损失一点生命值。(本方法可以使用任意次)

 

PS1.用来响应的方法可以使用任意次。

    2.若有牌可以响应则必须打出响应。

今天yjj邀请JSDZ来玩这个游戏,由JS作为玩家ADZ作为玩家B。现在告诉你JSDZ的手牌,聪明的你能告诉yjj谁能够胜利么?

【郑轻oj】1851-KILL(三国杀,贪心)(好玩!)_第1张图片

Input

首先输入一个整数T,代表有T组测试实例。(1<=T<=100

对于每组测试,输入包含三行,第一行包含两个整数nm,分别代表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;
}





你可能感兴趣的:(【郑轻oj】1851-KILL(三国杀,贪心)(好玩!))