UVa 170 - Clock Patience

题目:Clock Patience游戏,将52张扑克牌,按时钟依次分成13组(中心一组),每组4张全都背面向上,

从中间组最上面一张牌开始,翻过来设为当前值,然后取当前值对应组中最上面的背过去的牌翻过来,

取这个值为新的当前值,直到不能翻拍游戏结束;求结束时,翻过来的拍数以及最后翻过来的牌;

如果没看明白题目具体规则,百度玩一下就明白了。

分析:模拟,数据结构(DS)。设计13个栈,模拟即可。

说明:注意题目给的牌的顺序是逆序的,╮(╯▽╰)╭。

#include <algorithm>
#include <iostream>
#include <stack>

using namespace std;

char Maps[] = "A23456789TJQK";

typedef struct _pnode
{
	int  value;
	char color;
	_pnode(int v, char c) {value = v; color = c;}
	_pnode(){}
}pnode;
pnode cards[54];

int value(char ch)
{
	if (ch >= '2' && ch <= '9')
		return ch-'1';
	if (ch == 'A') return 0;
	if (ch == 'T') return 9;
	if (ch == 'J') return 10;
	if (ch == 'Q') return 11;
	if (ch == 'K') return 12;
}

int main()
{
	char V,C;
	while (cin >> V && V != '#') {
		cin >> C;
		stack<pnode> Q[13];
		cards[0] = pnode(value(V), C);
		for (int i = 1; i < 52; ++ i) {
			cin >> V >> C;
			cards[i] = pnode(value(V), C);
		}
		for (int i = 51; i >= 0; -- i)
			Q[12-i%13].push(cards[i]);

		int   count = 0, index = 12;
		pnode now;
		while (!Q[index].empty()) {
			now = Q[index].top();
			Q[index].pop();
			index = now.value;
			++ count;
		}

		if (count < 10) cout << "0";
		cout << count << "," << Maps[now.value] << now.color << endl;
	}
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-11 21:45:57

UVa 170 - Clock Patience的相关文章

UVA 1529 - Clock(数论)

题目链接:1529 - Clock 题意:给定两个时刻,求时针和分针相遇次数. 思路:先把转一圈会相遇的时刻记录下来,这些时刻肯定是固定的,然后由给定的两个时刻a,b,求出12点到a相遇次数c1,12点到b相遇次数c2,ans = c2 - c1 代码: #include <stdio.h> #include <string.h> const double esp = 1e-6; int h1, m1, h2, m2; double t1, t2, s[25]; int main(

uva 127 &quot;Accordian&quot; Patience(手风琴纸牌)

用 栈 stack 来处理. 直接根据题目描述写就可以.不要忘记每组数据最后的清空栈堆. 题目大意: 给定52张的扑克牌,现在要求对扑克牌进行整理,对于每一张扑克牌,如果左边的第三张存在那么就去判断这一张是否和第三张满足花色或卡片值相同,如果满足则把这一张移动到左边的第三张,否则去判断左边的第一张是否和这一张满足条件:如果左边的第三张不存在那么只要去判断左边的第一张即可.最后输出剩下的扑克牌的堆数,并且输出每一堆的牌数. #include<stdio.h> #include<iostre

uva 1529 - Clock(数论)

题目链接:uva 1529 - Clock 题目大意:给出两个时间,问从第一个时间变成第二个时间分针会和时针重叠几次. 解题思路:两个针重叠的时间是固定的,只要处理出这些重叠的时刻,在判断说给得时间区间包含的个数即可. #include <cstdio> #include <cstring> #include <cmath> const int T = 12 * 60 * 100; const int D = 6545; int sh, sm, eh, em; int

UVa 127 - &quot;Accordian&quot; Patience POJ 1214 链表题解

UVa和POJ都有这道题. 不同的是UVa要求区分单复数,而POJ不要求. 使用STL做会比较简单,这里纯粹使用指针做了,非常麻烦的指针操作,一不小心就错.调试起来还是非常费力的 本题理解起来也是挺费力的,要搞清楚如何模拟也不容易啊,读题要很仔细. 纯指针的操作挺快的吧.不过POJ 0ms,而UVa就0.2左右了. 三相链表: 1 只要有叠起来的牌,那么就使用一个down指针指向下面的牌就可以了. 2 使用双向链表,可以方便前后遍历. 3 记得有了更新牌之后,又要重新开始检查是否需要更新牌,这是

UVa 579 Clock Hands

水题.. 求任意时刻时针和分针的夹角,其结果在0°到180°之间. 这里又一次用到了sscanf()函数,确实很方便. 思路:我们分别求出时针和分针转过的角度,然后大的减小的,如果结果ans大于180,那么ans = 360 - ans.   ClockHands  The medieval interest in mechanical contrivances is well illustrated by the development of the mechanical clock, the

ACM学习历程——UVA 127 &quot;Accordian&quot; Patience(栈;模拟)

Description  ``Accordian'' Patience  You are to simulate the playing of games of ``Accordian'' patience, the rules for which are as follows: Deal cards one by one in a row from left to right, not overlapping. Whenever the card matches its immediate n

UVA 1637 Double Patience 概率DP

Double Patience Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Double Patience is a single player game played with a standard 36-card deck. The cards are shuffled and laid down on a table in 9 pile

UVA 127 &quot;Accordian&quot; Patience

题意: 按从左至右的顺序发牌,并摆成一行,发牌不要相互重叠.游戏中一旦出现任何一张牌与它左边的第一张或第三张“匹配”,即花色或点数相同,则须立即将其移动到那张牌上面.如果牌被移动后又出现了上述情况,则需再次向左移动.每叠牌只能移动最上面的一张.如果一叠牌被移空,应该立即将右边各叠整体向左移动,补上这个空隙.依次将整副牌都发完,并不断的向左合并.如果全部移动结束后整副牌都放成了一叠,则游戏胜利. 分析: 用sum表示有多少个牌挪动了,最后输出52-sum.判断是否能放到左边第三张的时候需要注意再前

uva 1637 Double Patience

https://vjudge.net/problem/UVA-1637 36张牌分成9堆,每堆4张牌.每次可以拿走某两堆顶部的牌,但需要点数相同. 如果有多种拿法则等概率的随机拿. 如果最后拿完所有牌则游戏成功.按顺序给出每堆牌的4张牌,求成功概率. #include<cstdio> using namespace std; char s[10][5]; char ss[5]; int left[10]; int v[2000001]; double dp[2000001]; int t; i