描述
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;
}