UVA 246 - 10-20-30 (模拟+STL)

UVA 246 - 10-20-30

题目链接

题意:给52张的扑克堆,先从左往右发7张牌,之后连续不断从左往右发7张牌,如果有牌堆形成了以下3种情况(按顺序判断):

1、头两张+尾一张和为10或20或30

2、头一张+尾两张和为10或20或30

3、尾三张和为10或20或30

就把这三张牌拿走,放到总牌堆底(这步要不断执行直到不再满足条件或牌堆没了)

如果有一个牌堆因为这个操作被取完了,那么以后将不在这个位置发牌。

如果最后7个牌堆都可以消掉,那么赢,总牌堆用完,那么输,否则平(即不断循环)

问最后的输赢平,并输出步数

思路:模拟,用一个vector记录下7个牌堆和总牌堆,这样就可以用set去记录状态了,然后每个牌堆用一个双端队列deque表示,这样满足可以从头也可以从尾巴取,不断模拟即可

代码:

#include <cstdio>
#include <cstring>
#include <set>
#include <queue>
#include <vector>
using namespace std;

int num, zero[8];
vector<deque<int> > piple;
set<vector<deque<int> > > vis;

void init() {
    vis.clear();
    piple.clear();
    memset(zero, 0, sizeof(zero));
    for (int i = 0; i < 8; i++)
	piple.push_back(deque<int>());
    piple[7].push_back(num);
    for (int i = 0; i < 51; i++) {
	scanf("%d", &num);
	piple[7].push_back(num);
    }
    for (int i = 0; i < 7; i++) {
	int now = piple[7].front();
	piple[7].pop_front();
	piple[i].push_back(now);
    }
}

bool can(int x) {
    return (x == 10 || x == 20 || x == 30);
}

bool tra1(int i) {
    int top1 = piple[i].front();
    piple[i].pop_front();
    int sum = top1 + piple[i].front() + piple[i].back();
    if (can(sum)) {
	piple[7].push_back(top1);
	piple[7].push_back(piple[i].front());
	piple[7].push_back(piple[i].back());
	piple[i].pop_front();
	piple[i].pop_back();
	return true;
    }
    piple[i].push_front(top1);
    return false;
}

bool tra2(int i) {
    int back1 = piple[i].back();
    piple[i].pop_back();
    int sum = back1 + piple[i].front() + piple[i].back();
    if (can(sum)) {
	piple[7].push_back(piple[i].front());
	piple[7].push_back(piple[i].back());
	piple[7].push_back(back1);
	piple[i].pop_front();
	piple[i].pop_back();
	return true;
    }
    piple[i].push_back(back1);
    return false;
}

bool tra3(int i) {
    int back1 = piple[i].back();
    piple[i].pop_back();
    int back2 = piple[i].back();
    piple[i].pop_back();
    int sum = back1 + back2 + piple[i].back();
    if (can(sum)) {
	piple[7].push_back(piple[i].back());
	piple[7].push_back(back2);
	piple[7].push_back(back1);
	piple[i].pop_back();
	return true;
    }
    piple[i].push_back(back2);
    piple[i].push_back(back1);
    return false;
}

bool tra(int i) {
    if (piple[i].size() < 3) return false;
    if (tra1(i)) return true;
    if (tra2(i)) return true;
    if (tra3(i)) return true;
    return false;
}

void solve() {
    int i = 0;
    for (int t = 8; ; t++) {
	int now = piple[7].front();
	piple[7].pop_front();
	piple[i].push_back(now);
	while (tra(i));
	if (piple[i].size() == 0)
	    zero[i] = 1;
	i = (i + 1) % 7;
	if (vis.find(piple) != vis.end()) {
	    printf("Draw: %d\n", t);
	    return;
	}
	vis.insert(piple);
	if (piple[7].size() == 0) {
	    printf("Loss: %d\n", t);
	    return;
	}
	if (piple[7].size() == 52) {
	    printf("Win : %d\n", t);
	    return;
	}
	while (zero[i]) i = (i + 1) % 7;
    }
}

int main() {
    while (~scanf("%d", &num) && num) {
	init();
	solve();
    }
    return 0;
}
时间: 2024-10-13 03:42:46

UVA 246 - 10-20-30 (模拟+STL)的相关文章

UVA - 246 10-20-30 (模拟+STL)

Description  10-20-30  A simple solitaire card game called 10-20-30 uses a standard deck of 52 playing cards in which suit is irrelevant. The value of a face card (king, queen, jack) is 10. The value of an ace is one. The value of each of the other c

个人回忆录 2014.10.20 至 2015.7.30

时间过的太快.以至于对我来说都记不起来每天做了些什么事情.工作节奏太快,下班.上班 然后再下班再上班. 每天下班后都晚上9点左右.真的看不见日出看不见日落. 从2014.10.20 到现在已经快10个月了.新的工作环境以及新的同事.上司都已熟悉了.回想刚刚开始进入这个研发团队的时候. 高原反应非常强烈,总是在疑问自己为何选择这个方向—C++ 客户端开发.为何不沿用最熟悉的.NET 平台开发.当从新学习一门新技术的时候 才发现自己太笨.有点像当年的高考,时间很紧.因为没有太多的时间用在学习上.MF

[uva 246][deque]10-20-30

 10-20-30  A simple solitaire card game called 10-20-30 uses a standard deck of 52 playing cards in which suit is irrelevant. The value of a face card (king, queen, jack) is 10. The value of an ace is one. The value of each of the other cards is the

UVA 10142 Australian Voting(模拟)

题意:澳大利亚投票系统要求选民们将所有候选人按愿意选择的程度排序,一张选票就是一个排序.一开始,每张选票的首选项将被统计.若有候选人得票超过50%,他讲直接胜出:否则,所有并列最低的候选人出局,而那些将出局候选人排在第一位的选票将被重新统计为排名最高的未出局候选人.这一筛选过程将持续进行,直到某个候选人得到超过50%的选票,或所有候选人得票相同. #include<cstdio> #include<cstring> #include<iostream> #include

10.4 noip模拟试题

题目名称 PA 青春 三部曲 名称 huakai taritari truetears 输入 huakai.in taritari.in truetears.in 输出 huakai.out taritari.out truetears.out 每个测试点时限 1秒 1秒 1秒 内存限制 512MB 512MB 512MB 测试点数目 10 10 10 每个测试点分值 10 10 10 是否有部分分 无 无 无 题目类型 传统 传统 传统 注意事项(请务必仔细阅读): PA [题目描述] 汉诺塔

UVa - 10815 Andy&#39;s First Dictionary(STL)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18649 #include <iostream> #include <string> #include <set> #include <sstream> using namespace std; /******************************************************************

10.19-10.22 iptables规则备份和恢10.20 firewalld的9个zone

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 # 10.19 iptables 规则备份和恢复 - 保存和备份iptables 的规则 - service iptables save 会把规则保存到 /etc/sysconfig/iptables - 把iptables规则备份到my.ipt 文件中 - iptables-save > my.ipt

(转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html)WebWork深入浅出

(转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html) WebWork深入浅出 本文发表于<开源大本营> 作者:钱安川 前言 本篇文章并没有太多WebWork 的实战代码细节.本人非常希望能充当一名导游的角色,带领读者逐步游览WebWork的功能特性和原理.在第一章,我们将提出基于三层架构的Web层需要解决的10个问题,这是本文的纵轴.围绕着纵轴,我们按照横轴的顺序逐步描述讲解:WebWork简介.WebWork入门.We

从“假如有以下几种价格10,20,50,请你代码实现将他们排序输出”看着设计模式中的策略模式

今天重温了一下策略模式,将自己的一些感悟与大家分享...本人只是技术渣渣,所理解的东西的难免会有很大的局限性甚至是错误,还请各位带着批判的眼光去看待....不喜请勿吐槽 定义:策略模式属于设计模式中的对象行为型模式,它将用到的算法单独抽象成一个单独的类.通常,我们在多个类完成同一件事情,仅仅完成的方式不同时,我们可以考虑使用这种设计模式. 举例:相信,很多人在看到"假如有以下几种价格10,20,50,请你代码实现将他们排序输出"这种题目的时候,很快就写出了以下代码,写之前还不忘了问一下