[超级大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大模拟]7王523

描述 你玩过7王523吗?

这个扑克牌游戏可以2~5个人玩,最开始的时候,每人5张牌,庄家6张牌。庄家首先出牌,然后轮流出牌或不出牌。

第一个出牌的人可以打出任意牌,后面的人必须比前面的牌大才能出牌,且牌型必须要和前面人出牌的牌型一致或大于前面人的牌型。
牌的大小关系是7>大王>小王>5>2>3>A>K>Q>J>10>9>8>6>4.不区分花色。

牌型有:对子(两张牌点数一样),炸弹(三张牌一样),氢弹(四张牌一样)

牌型的大小关系是:氢弹>炸弹>对子、单牌

另外还有一种特殊的出牌规则,如果有人出单牌,某人手上有一样点数的对子,则有对子的人可以忽略出牌顺序直接“碰”。在“碰”后,后面只有炸弹或氢弹可以出。(比如甲出单牌,后面只要有人有碰,一定是先满足碰)

当某个人打出的牌没人要时,本轮出牌结束,最后一个出牌的人取得本轮胜利,本轮出的牌就是胜利的人的积分,1张牌记1分。再由胜利的人开始在剩余牌中按顺序拿几张牌和手上的牌凑够五张,接下来按顺序另外的人也从剩余牌中按顺序拿够5张。
例如:

甲:2 4 4 6 K 乙:3 8 8 J 10 丙:K K 4 A A 剩余牌:7 7 2 假设出牌顺序是甲、乙、丙;

第一轮:甲先出6,则乙可以出J、10或3;丙如果不要,则甲可以出2.这个时候没有人有牌能够大过2,该轮出牌结束,甲获得胜利可以得到3个积分。接下来甲可以从剩余牌中获得2个7,而乙可以获得2.丙没有出牌就不能拿。

第二轮:甲出K,这个时候丙可以跳过乙优先进行“碰”,由于其他人没有炸弹,所以丙获得该轮胜利,得到3个积分。

为了简化问题,我们不考虑获胜的策略。也就是说轮到某人出牌,如果他手上的牌有大于前面人出的牌,则他就打出刚好大于前面的牌(有出必出),有“碰”必“碰”。
比如第一个人出Q,第二个人牌是K333,第三个人牌是QQJ,则第三个人会先碰出来。因为对于第二个人来说他优先选择出K,所以第三个人先碰。

每一轮第一个出牌的人,优先出手中最小的对子(对7除外),没有对子就出最小的单牌,没有单牌出对7,没有对7出最小的炸弹,没有炸弹出氢弹。

接下来轮流出牌,出的牌型必须和前面一至或大于前面的牌型,对子、炸弹、氢弹不能拆开出,出牌的原则的刚好大于前面的牌,如果没有大过前面的牌就PASS,由后面一个人出牌。如果一个人出的牌其他人都pass,则本轮结束,最后一个出牌的为胜利者。

注:大王与小王不在一起算单牌,大王和小王在一起算炸弹(不能拆开),且是仅次于777的最大炸弹。

开始的时候,第一个人自动作为庄家先拿前面的6张牌,接下来玩家依次拿5张。当没有剩余的牌且某个玩家手上没有牌,游戏结束,其他玩家手中的没有打出去的牌自动算为该玩家的积分。

输入 一共2行;

第一行是一个整数M表示玩家人数,第二行是一个字符串表示初始牌的顺序,其中大王用G表示,小王用F表示,10用X表示。

输出 M行,每行是一个整数,表示第i个玩家最后获得的积分。

样例输入
3
25G36Q3885XKK4AA77A
样例输出
13
2
4

提示 样例解释

第一轮:第一个人出6,然后第二个人出X,第三个人不要,第一个人出Q,第二个人出3,第三个人不要,第一个人出2,第二个人出5、三个人不要,第一个人出G,第二三个人不要,第一轮结束。第一个人获得积分7,然后获得77A三张牌

第二轮:第一个人出A, 第三个人有碰优先由第三个人碰,第三个人碰后,没有人有炸弹,该轮第三个人胜利。第三个人获得积分3

第三轮:第三个人出对K,第一个人出对7,第一个人取得本轮胜利获得积分4

第四轮:第一个人出3,第二个人、第三个人pass,第一个人取得胜利获得积分1

第五轮:第一个人出5,第一个人取得胜利获得积分1。游戏结束。

最后得分:

第一个人:13

第二个人:2

第三个人:4
在这里插入图片描述

吐槽:
首先你得花个1h读题,然后花个3h写,然后花个3h调试,然后花个3h在WA的海洋里漫游,是不是很简单?

分析:
那么我们说真的,这题怎么做?DZYO:乱做
那么这题怎么做?乱做

代码(from DZYO):

#include <bits/stdc++.h>
using namespace std;

int n,len,pt=1,sum[5],now;
char s[1000];
inline int pri(char c) {
	if(c=='4') return 1;
	else if(c=='6') return 2;
	else if(c=='8') return 3;
	else if(c=='9') return 4;
	else if(c=='X') return 5;
	else if(c=='J') return 6;
	else if(c=='Q') return 7;
	else if(c=='K') return 8;
	else if(c=='A') return 9;
	else if(c=='3') return 10;
	else if(c=='2') return 11;
	else if(c=='5') return 12;
	else if(c=='F') return 13;
	else if(c=='G') return 14;
	else return 15;
}
struct atom {
	int type,num;
	atom() {}
	atom(int type,int num) : type(type),num(num) {} 
	inline int cnt() {
		if(type==3) return (num==13) ? 2 : 3;
		else return type;
	}
};
typedef pair <atom,int> pii;
int tag=0;
struct game {
	int id,cnt[20];
	map <int,int> vec[5];
	inline void rebuild() {
		for(int i=1;i<=4;i++) vec[i].clear();
		for(int i=1;i<=12;i++) 
			if(cnt[i]) vec[cnt[i]][i]=1;
		if(cnt[13] || cnt[14]) {
			if(cnt[13]+cnt[14]==2) vec[3][13]++;
			else vec[1][cnt[13] ? 13 : 14]++;
		} 
		if(cnt[15]) vec[cnt[15]][15]++;
	}
	inline void draw(int t) {
		while(t && pt<=len) t--, cnt[pri(s[pt++])]++;
		rebuild();
	}
	inline int res() {
		int rs=0;
		for(int i=1;i<=15;i++) rs+=cnt[i];
		return rs;
	}
	inline atom first() {
		atom t;
		if(vec[2].size() && vec[2].begin()->first!=15) {
			t=atom(2,vec[2].begin()->first);
			cnt[t.num]-=2;
		} else if(vec[1].size()) {
			t=atom(1,vec[1].begin()->first);
			cnt[t.num]--;
		} else if(vec[2].size()) {
			t=atom(2,15);
			cnt[15]-=2;
		} else if(vec[3].size()) { 
			t=atom(3,vec[3].begin()->first);
			if(t.num!=13) cnt[t.num]-=3;
			else cnt[13]--, cnt[14]--;
		} else {
			t=atom(4,vec[4].begin()->first);
			cnt[t.num]-=4;
		} rebuild(); return t;
	}
	typedef map <int,int> :: iterator iter;
	inline pii get_nxt(atom t) {
		tag=0;
		if(t.type==1) {
			if(cnt[t.num]==2) {
				cnt[t.num]-=2;
				rebuild();
				return tag=1,pii(atom(3,t.num),id); 
			}
		}
		for(int i=t.type;i<=4;i++) {
			if(t.type==1 && i==2) continue;
			iter it=(i==t.type) ? vec[i].upper_bound(t.num) : vec[i].begin();
			if(it==vec[i].end()) continue;
			else {
				atom v=atom(i,it->first); 
				if(v.type==3 && v.num==13) {
					--cnt[13]; --cnt[14];
				} else {
					cnt[v.num]-=i;
				} rebuild();
				return pii(v,id);
			} 
		} return pii(atom(0,0),0);
	}
} a[5];
inline bool check() {
	if(pt<=len) return true;
	for(int i=1;i<=n;i++) 
		if(!a[i].res()) return false;
	return true;
}
inline pii find_nxt(atom t,int now) {
	if(t.type==1) {
		for(int j=now%n+1;j!=now;j=j%n+1) 
			if(a[j].cnt[t.num]==2) 
				return a[j].get_nxt(t);
	} 
	for(int j=now%n+1;j!=now;j=j%n+1) {
		pii v=a[j].get_nxt(t);
		if(v.second) return v;
	} return pii(atom(0,0),0);
}
int main() {
	cin>>n; 
	for(int i=1;i<=n;i++) a[i].id=i;
	scanf("%s",s+1); 
	len=strlen(s+1);
	a[1].draw(6); now=1;
	for(int j=2;j<=n;j++) a[j].draw(5);
	while(check()) {
		int cnt=0;
		atom t=a[now].first();
		cnt+=t.cnt();
		pii nxt=find_nxt(t,now);	
		while(nxt.second) {
			cnt+=nxt.first.cnt()-tag;
			t=nxt.first; now=nxt.second;
			nxt=find_nxt(t,now);
		}
		sum[now]+=cnt;
		a[now].draw(5-a[now].res());
		for(int j=now%n+1;j!=now;j=j%n+1) 
			a[j].draw(5-a[j].res());
	}
	for(int j=1;j<=n;j++) sum[j]+=a[j].res();
	for(int i=1;i<=n;i++) cout<<sum[i]<<'\n';
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab智能算法超级手册程序是一种专门为Matlab程序设计师提供的工具,旨在帮助他们更高效地设计和实现智能算法。该手册程序包含了丰富的智能算法模型和算法实现代码,并提供了详细的说明和示例,使用户能够快速掌握和应用这些算法。 该手册程序的主要特点包括: 1. 多种智能算法模型:包括遗传算法、粒子群优化算法、模拟退火算法等多种经典的智能算法模型,用户可以根据自己的需求选择合适的算法模型。 2. 丰富的算法实现代码:手册程序内置了各种算法的实现代码,并提供了详细的代码说明和使用示例,用户可以直接调用这些代码进行算法实现。 3. 可视化界面:该手册程序提供了直观的可视化界面,用户可以通过界面进行算法的参数设置、数据输入和结果显示,大大简化了算法的调试和使用过程。 4. 智能化优化:手册程序还设计了一套智能化优化算法,用于自动调整算法的参数,以求得较好的优化效果。 5. 跨平台兼容:该手册程序可以在各种主流操作系统上运行,包括Windows、Mac和Linux等,用户可以根据自己的需求选择合适的平台。 总之,Matlab智能算法超级手册程序是一个功能强大、易用性高的工具,可以帮助Matlab程序设计师快速实现各种智能算法,并在实际应用中取得较好的效果。无论是研究领域还是工程实践,该手册程序都能为用户提供有力的支持和帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值