列表

详情


NC217389. 金钩钓鱼

描述

溪染和他的小伙伴去郑州培训时
买了扑克牌,准备打斗地主
但是矢信突然不玩了
溪染只好和叁秋玩起了金钩钓鱼

游戏规则


扑克牌的规格

扑克牌一共有张牌,分为种花色加上大小王各张。花色分为梅花、方片、红桃、黑桃各张牌,分别为。如果一副新的扑克牌,是有张的,因为多张是空白牌,让别人作切牌用的。

溪染和叁秋为了方便,扔掉了空白牌和大小王

那么这里一共有张牌

金钩钓鱼的规则


  1. 摸牌:两人轮流从牌堆中按顺序取一张牌,放入自己的牌队列中,先取的牌需要先行打出
  2. 摸牌结束后(牌堆的牌需要全部摸走),参加游戏的两人,必须按顺序出牌
  3. 然后,从第一个抓牌人开始,依次出牌,先摸到的牌先打出去
  4. 如果有两张一样的牌出现(不管花色),最后出牌的人,就把两张相同牌之间(包括这两张牌)所有的牌取走,放到自己的牌队列后(最后打出的牌最先入队);这些情况处理完了之后,收取牌的人要先出一张牌,下面的人再出牌。出牌的时候,手中的牌也要依次按顺序出牌,不能挑牌和倒牌
  5. 但一个人的手中没有牌时,游戏结束
  6. 特殊牌,是一个特殊牌,游戏中只要有它出现,桌面上的牌就全部归出牌人了,且需要再出一张牌;这就是“钩”到的“鱼”(打出的也会收回),特殊的,当桌面上没有牌可以钩的时候,应该留在桌面上成为第一张牌,这就是空钩



规定

由于叁秋太菜了,溪染决定让叁秋先摸牌

当一个人没有牌时,游戏立即结束

当一个人打出了最后一张牌,但是又得到了几张牌时,不判定此人输


输入描述

一个字符串,表示一个牌堆。
, 是牌堆最上面的牌。
注意扑克牌占两格字符宽度。

输出描述

输出
第一行输出胜利者
(分别对于溪染和叁秋)
第二行输出胜利者目前的手牌,用空格隔开

示例1

输入:

5102297A1010562388JQAK869A754537286K444J3KJ9Q91067J3QKQA

输出:

sanqiu
2 2 J Q 8 8 8 A 5 A J Q 7 J 3 4 9 10 9 Q 9 K A Q 10 10 6 5 6 K 4 8 K 7 6 7 3 K 2 4 7 6 3 5 2 10 5

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 6ms, 内存消耗: 376K, 提交时间: 2021-06-10 19:28:44

#include<bits/stdc++.h>
using namespace std;
#define N 53
#define For(i,x,y)for(i=x;i<=(y);i++)
string str;
char xiran[N],sanqiu[N],card[N];
int main()
{
	int i,k,p,q,rem;
	k=p=q=rem=0;
	cin>>str;
	For(i,0,str.size()-1)
	{
		if(str[i]=='0')continue;
		if(rem&1)xiran[++p]=str[i];
		else sanqiu[++q]=str[i];
		rem^=1;
	}
	while(p&&q)
	{
		if(rem)
		{
			card[++k]=xiran[1];
			For(i,2,p)xiran[i-1]=xiran[i];
			p--;
		}
		else
		{
			card[++k]=sanqiu[1];
			For(i,2,q)sanqiu[i-1]=sanqiu[i];
			q--;
		}
		if(card[k]=='J')i=1;
		else
		For(i,1,k-1)
		if(card[i]==card[k])break;
		if(i==k)
		{
			rem^=1;
			continue;
		}
		while(k>=i)
		if(rem)xiran[++p]=card[k--];
		else sanqiu[++q]=card[k--];
	}
	puts((p?"xiran":"sanqiu"));
	For(i,1,p|q)
	if(p)if(xiran[i]=='1')cout<<"10 ";
	else cout<<xiran[i]<<' ';
	else if(sanqiu[i]=='1')cout<<"10 ";
	else cout<<sanqiu[i]<<' ';
	return 0;
}

上一题