欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CH_0802 占卜DIY(算法竞赛进阶指南,stl,模拟)

程序员文章站 2024-03-19 09:50:58
...

算法竞赛进阶指南48页,stl,模拟
本题要点:
1、用 deque 来存放每一对扑克, 因为 deque 可以两头放数据。 用数字,表示扑克的大小,deque
2、4 条命,剩下的就是模拟运行过程。
3、题目要求的是,每堆牌, 4张都要正面朝上,因此,用数组 turn[i] 来存放 第 i 堆正面朝上的次数。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
deque<int> deq[14];		// 每堆牌放的 4 个数
int turn[14];			//每堆牌正面朝上的次数
char s[2];
int char_to_int[256];

void solve()
{
	int life = 4;
	int card;
	while(life)
	{
		card = deq[13].front();
		deq[13].pop_front();
		while(card != 13)
		{
			deq[card].push_front(card);	
			turn[card]++;	//每堆牌正面朝上的次数
			int tmp = deq[card].back();
			deq[card].pop_back();
			card = tmp;	// 这里注意一下, card 最后赋值
		}
		--life;
	}
	int ans = 0;
	for(int i = 1; i <= 12; ++i)
	{
		if(turn[i] == 4)
			++ans;
	}
	printf("%d\n", ans);
}

int main()
{
	for(int i = 2; i <= 9; ++i)
		char_to_int['0' + i] = i;
	char_to_int['0' + 0] = 10;
	char_to_int['A' + 0] = 1, char_to_int['J' + 0] = 11;
	char_to_int['Q' + 0] = 12, char_to_int['K' + 0] = 13;
	for(int i = 1; i <= 13; ++i)
	{
		for(int j = 0; j < 4; ++j)
		{
			scanf("%s", s);
			deq[i].push_back(char_to_int[s[0] + 0]);
		}
	}
	solve();
	return 0;
}


/*
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
*/