首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【郑轻oj】1851-KILL(三国杀,贪心)(好玩!)

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

作者头像
FishWang
发布2025-08-26 18:59:05
发布2025-08-26 18:59:05
1240
举报

点击打开题目

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

DZ

JS

第一次提交总是wa,原因是使用卡牌的顺序。

下面总结一下:

1.消耗闪的牌有杀和万箭齐发。消耗杀的牌有决斗、南蛮入侵,闪的处理很简单,但是决斗会伤到自己,而且还包括了一个互相消耗杀的过程,所以,应该安排好使用的顺序。

2.根据第一条,此题分为两方面削血。第一是需要用闪应答的,第二是需要用杀应答的。二者的顺序又是一个问题,这里考虑到对方0闪的情况,应该先用万箭齐发和杀。

3.先说应答“闪”的牌的排序:万箭齐发和杀本来都是消耗一张闪的,然而杀一回合只有一次,所以应该先万箭齐发,后判断对方是不是有闪,有的话就没必要杀,留着决斗吧。

4.再说应答“杀”的牌的排序:决斗是快速消耗对方杀的好牌,一定是先用的,但是要考虑到自己生命值是1的情况,给自己玩死了就不好了。所以应该先决斗,再南蛮入侵,再决 斗。

个人吐槽:太好玩!

AC代码如下:

代码语言:javascript
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 点击打开题目
  • 1851: KILL Time Limit: 1 Sec Memory Limit: 128 MB Submit: 27 Solved: 3 Submit Status Web Board
  • Description
  • Input
  • Output
  • Sample Input
  • Sample Output
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档