• 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

    20181029183017_44667

    是不是一道很简单的模拟题啊

    直接模拟就好了

    代码也不长

    最多的也才5.7k左右

    #include<bits/stdc++.h>
    using namespace std;
    char ch[60];
    int pai[60],num[5],a[5][20],n,jz,len;
    inline bool check(){
    	for(int i=1;i<=n;i++){
    		int k=0;
    		for(int j=1;j<=16;j++)
    			if(a[i][j])
    				k+=a[i][j];			
    		if(!k)return false;
    	}
    	return true;
    }
    inline bool chupai(int &kind,int &ji,int p){
    	if(kind==0){
    		for(int i=1;i<=14;i++){
    			if(a[p][i]==2){
    				a[p][i]=0,num[p]-=2,kind=2,ji=i;return true;
    			}
    		}
    		for(int i=1;i<=15;i++){
    			if(a[p][i]==1){
    				a[p][i]=0,num[p]-=1,kind=1,ji=i;return true;
    			}
    		}
    		if(a[p][15]==2){
    			a[p][15]=0,num[p]-=2,kind=2;ji=15;return true;
    		}
    		for(int i=1;i<=16;i++){
    			if(a[p][i]==3){
    				a[p][i]=0;
    				if(i==16)num[p]-=3;
    				else num[p]-=3;
    				kind=3,ji=i;
    				return true;
    			}
    		}
    		for(int i=1;i<=15;i++){
    			if(a[p][i]==4){
    				a[p][i]=0;
    				num[p]-=4;
    				kind=4,ji=i;
    				return true;
    			}
    		}
    	}
    	for(int i=ji+1;i<=16;i++){
    		if(a[p][i]==kind){
    			a[p][i]=0;
    			if(i==16)num[p]-=2;
    			else num[p]-=kind;
    			ji=i;
    			return true;
    		}
    	}
    	int k=max(kind+1,3);
    	while(k<=4){
    		for(int i=1;i<=16;i++){
    			if(a[p][i]==k){
    				a[p][i]=0;
    				if(i==16)num[p]-=2;
    				else num[p]-=k;
    				kind=k,ji=i;
    				return true;
    			}
    		}
    		k++;
    	}
    	return false;
    }
    inline int peng(int kind,int ji,int p){
    	if(kind!=1)return 0;
    	for(int i=p%n+1;i!=p;i=i%n+1)
    		if(a[i][ji]==2){
    			a[i][ji]=0,num[i]-=2;return i;
    		}
    	return 0;
    }
    inline void zaicifapai(int p){
    	while(num[p]<5){
    		num[p]++,a[p][pai[++jz]]++;	
    		if(a[p][13]&&a[p][14]){
    			a[p][13]=a[p][14]=0,a[p][16]=3;
    		}
    		if(jz>=len)return;	
    	}
    	for(int i=p%n+1;i!=p;i=i%n+1){
    		while(num[i]<5){
    			num[i]++,a[i][pai[++jz]]++;	
    			if(a[i][13]&&a[i][14]){
    				a[i][13]=a[i][14]=0,a[i][16]=3;
    			}
    			if(jz>=len)return;		
    		}
    	}
    }
    int fenshu[5];
    int main(){
    	cin>>n;
    	scanf("%s",ch);
    	len=strlen(ch);
    	for(int i=0;i<len;i++){
    		if(ch[i]=='7')pai[i+1]=15;
    		if(ch[i]=='G')pai[i+1]=14;
    		if(ch[i]=='F')pai[i+1]=13;
    		if(ch[i]=='5')pai[i+1]=12;
    		if(ch[i]=='2')pai[i+1]=11;
    		if(ch[i]=='3')pai[i+1]=10;
    		if(ch[i]=='A')pai[i+1]=9;
    		if(ch[i]=='K')pai[i+1]=8;
    		if(ch[i]=='Q')pai[i+1]=7;
    		if(ch[i]=='J')pai[i+1]=6;
    		if(ch[i]=='X')pai[i+1]=5;
    		if(ch[i]=='9')pai[i+1]=4;
    		if(ch[i]=='8')pai[i+1]=3;
    		if(ch[i]=='6')pai[i+1]=2;
    		if(ch[i]=='4')pai[i+1]=1;
    	}
    	num[1]=6;
    	for(int i=1;i<=6;i++){
    		a[1][pai[++jz]]++;
    		if(a[1][13]&&a[1][14]){
    			a[1][13]=a[1][14]=0,a[1][16]=3;
    		}
    	}
    	for(int i=1;i<n;i++){
    		for(int j=1;j<=5;j++)
    		a[i+1][pai[++jz]]++,num[i+1]=5;
    		if(a[i][13]&&a[i][14])
    			a[i][13]=a[i][14]=0,a[i][16]=3;
    	}
    	int first=1;
    	while(jz<=len||check()){
    		int prek=0,pren=0,l=0;
    		chupai(prek,pren,first);
    		if(pren==16)l+=2;
    		else l+=prek;
    		for(int i=first%n+1;i!=first;i=i%n+1){
    			int k=peng(prek,pren,first);
    			if(k){
    				first=i=k,l+=2,prek=3,pren=0;
    			}
    			else if(chupai(prek,pren,i)){
    				if(pren==16) l+=2;
    				else l+=prek;first=i;
    			}
    		}
    		if(jz<=len)
    		zaicifapai(first);
    		fenshu[first]+=l;
    	}
    	for(int i=1;i<=n;i++)num[i]=0;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=16;j++)
    			if(a[i][j])
    				if(j!=16)num[i]+=a[i][j];
    				else num[i]+=2;				
    	for(int i=1;i<=n;i++)
    		cout<<fenshu[i]+num[i]<<endl;
    }
  • 相关阅读:
    Linux下高并发socket最大连接数所受的各种限制
    Oracle DB 使用资源管理
    Oracle DB 资源管理
    C++ 封装私有堆(Private Heap)
    用宏实现 C++ Singleton 模式
    基于 crt debug 实现的 Windows 程序内存泄漏检测工具
    如何养成良好的 C++ 编程习惯 —— 内存管理
    OCP-1Z0-053-V12.02-643题
    Oracle DB 通过SQL 优化管理性能
    OCP-1Z0-052-V8.02-141题
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/10366433.html
Copyright © 2020-2023  润新知