占卜DIY

占卜DIY

有一副牌(去掉大小王),分成13堆(有序的),每堆牌的牌种已经给出,现在进行以下操作

  1. 从第13堆牌中拿出一张牌点数为a,如果第13堆牌中没有牌了,停止操作
  2. 到达第a堆牌,拿出第a堆牌牌底的牌
  3. 如果a点数为13,就丢掉,重复操作1
  4. 否则重复操作2

询问

模拟题,只提一个要点,就是1,3,4可以合并成一步操作,因为牌13正好与第13堆牌对应,这是题目的隐含条件,并非一定要照着以上步骤一个一个打,于是设初始摸到牌13,然后循环操作2,终止条件为第13堆牌没牌了,就不需要代码又臭又长了。

参考代码:

#include <iostream>
#include <cstdio>
#define il inline
#define ri register
using namespace std;
char to[257];
int p[14][5],lp[14],b[14];
il void get(char&);
int main(){char c;
	for(int i(2);i<10;++i)to[i+48]=i;to['A']=1;
	to['0']=10,to['J']=11,to['Q']=12,to['K']=13;
	for(int i(1),j;i<=13;++i)
		for(j=1,lp[i]=4;j<=4;++j)
			get(c),p[i][j]=to[c];int q(13);
	do q=p[q][lp[q]--],++b[q];while(lp[13]>=0);
	int ans(0);for(int i(1);i<13;++i)if(b[i]==4)++ans;
	printf("%d",ans);
	return 0;
}
il void get(char &c){
	while(c=getchar(),c==' '||c=='
'||c=='
');
}

原文地址:https://www.cnblogs.com/a1b3c7d9/p/11220823.html