描述

lyd学会了使用扑克DIY占卜。方法如下:一副去掉大小王的扑克共52张,打乱后均分为13堆,编号1~13,每堆4张,其中第13堆称作“生命牌”,也就是说你有4条命。这里边,4张K被称作死神。
初始状态下,所有的牌背面朝上扣下。
流程如下:
1.抽取生命牌中的最上面一张(第一张)。
2.把这张牌翻开,正面朝上,放到牌上的数字所对应编号的堆的最上边。(例如抽到2,正面朝上放到第2堆牌最上面,又比如抽到J,放到第11堆牌最上边,注意是正面朝上放)
3.从刚放了牌的那一堆最底下(最后一张)抽取一张牌,重复第2步。(例如你上次抽了2,放到了第二堆顶部,现在抽第二堆最后一张发现是8,又放到第8堆顶部………)
4.在抽牌过程中如果抽到K,则称死了一条命,就扔掉K再从第1步开始。
5.当发现四条命都死了以后,统计现在每堆牌上边正面朝上的牌的数目,只要同一数字的牌出现4张正面朝上的牌(比如4个A),则称“开了一对”,当然4个K是不算的。
6.统计一共开了多少对,开了0对称作”极凶”,1~2对为“大凶”,3对为“凶”,4~5对为“小凶”,6对为“中庸”,7~8对“小吉”,9对为“吉”,10~11为“大吉”,12为“满堂开花,极吉”。

输入格式

一共13行,为每堆牌的具体牌是什么(不区分花色只区分数字),每堆输入的顺序为从上到下。
为了便于读入,用0代表10,那么A,J,Q,K(大写)就不用说了吧。。。

输出格式

一共开了几对。

样例输入

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

样例输出

9

样例解释

注解:第一条命死后前12堆牌变成了这个样子:
A A A 8
K 5 3 2
3 9 6 0
4 4 3 4
5 5 3 4
6 6 5 6
7 7 7 7
8 8 8 9
9 9 0 0
0 K J J
J Q A Q//抽到这里的K死掉了
J Q 2 2
第二条命由于K在生命牌中,所以直接死掉,不变。
第三条命死后前12堆牌变成了这个样子:
A A A A
2 2 2 K
3 3 3 3
4 4 4 4
5 5 5 5
6 6 6 6
7 7 7 7
8 8 8 8
9 9 9 9
0 0 0 0//抽到这里的K死掉了
J J J Q
Q Q J Q
第四条命死后前12堆牌变成了这个样子:
A A A A
2 2 2 2//抽到这里的K死掉了
3 3 3 3
4 4 4 4
5 5 5 5
6 6 6 6
7 7 7 7
8 8 8 8
9 9 9 9
0 0 0 0
J J J Q
Q Q J Q
最后发现在所有已经正面朝上的牌中,A 2 3 4 5 6 7 8 10这9对牌“开”了,(注意,第9堆牌中的最后一张虽然也是9,但是并没有被翻开!所以不能算)因此输出9,运势为“吉”。

#include<algorithm>
#include <iostream>
#include  <cstdlib>
#include  <cstring>
#include  <cassert>
#include   <cstdio>
#include   <vector>
#include   <string>
#include    <cmath>
#include    <queue>
#include    <stack>
#include      <set>
#include      <map>
using namespace std;
#define P(a,b,c) make_pair(a,make_pair(b,c))
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define CLR(vis) memset(vis,0,sizeof(vis))
#define MST(vis,pos) memset(vis,pos,sizeof(vis))
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef pair<int,pair<int,int> >pii;
typedef long long ll;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }

const int maxn = 1e2+5;
deque<int>k[20]; //双端队列
int cnt[20];
int getnum(char ch){
	if(ch=='A')return 1;
	if(ch=='0')return 10;
	if(ch=='J')return 11;
	if(ch=='Q')return 12;
	if(ch=='K')return 13;
	return ch-'0';
}
int main(){
	char s[10];
	memset(cnt,0,sizeof(cnt));
	rep(i,1,13){
		rep(j,1,4){
			scanf("%s", s);
			k[i].push_back(getnum(s[0]));//放到队尾
		}
	}
	memset(cnt,0,sizeof(cnt));
	int num=13;//第一张翻第十三堆
	while(1){
		//翻面放到顶端
		//拿走底端牌
		int t;
		int flag=1;
		if(num!=13){//不是k,则
			k[num].push_front(num);//放入队列前
			t=k[num].back();//得到队列尾部的值
			k[num].pop_back();//取出
			num=t;//记录该值
		}else{//k
			t=k[num].front();//得到队列前的值
			k[num].pop_front();//弹出
			num=t;//记录
		}
		cnt[num]++;//计算出现次数 ,每一张牌不会被抽到第二次
		if(cnt[13]==4)break;//终止条件
	}
	int ccnt=0;
	rep(i,1,12)if(cnt[i]==4)ccnt++;
	cout<<ccnt<<endl;
	return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注