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 <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <deque>
#include <vector>
#include <map>
#include <queue>
using namespace std;
const int N=7;
int ans;
struct node
{
int v[N*10];
bool operator<(const node &a) const
{
return memcmp(v,a.v,sizeof(node))<0;
}
};
queue<int> hand;
deque<int> piles[N];
map<node,int> st;
void handle (deque<int>& pile)
{
while (pile.size() >= 3)
{
int n=pile.size();
if((pile[0]+pile[1]+pile[n - 1])%10==0)
{
hand.push(pile[0]);
hand.push(pile[1]);
hand.push(pile[n-1]);
pile.pop_front();
pile.pop_front();
pile.pop_back();
}
else if((pile[0]+pile[n-1]+pile[n-2])%10==0)
{
hand.push(pile[0]);
hand.push(pile[n-2]);
hand.push(pile[n-1]);
pile.pop_front();
pile.pop_back();
pile.pop_back();
}
else if((pile[n-1]+pile[n-2]+pile[n-3])%10==0)
{
hand.push(pile[n - 3]);
hand.push(pile[n - 2]);
hand.push(pile[n - 1]);
pile.pop_back();
pile.pop_back();
pile.pop_back();
}
else
return;
}
}
int solve()
{
for(int i=0;i<2;i++)
{
for(int j=0;j<N;j++)
{
piles[j].push_back(hand.front());
hand.pop();
}
}
ans=14;
node tmp;
while(hand.size())
{
for(int i=0;i<N;i++)
{
if(hand.size()==52)
return 1;
if(piles[i].size()==0)
continue;
if(hand.size())
{
piles[i].push_back(hand.front());
hand.pop();
ans++;
handle(piles[i]);
int cnt=0;
memset(tmp.v,0,sizeof(tmp.v));
for(int k=0;k<N;k++)
{
for (int j=0;j<piles[k].size();j++)
tmp.v[cnt++]=piles[k][j];
tmp.v[cnt++]=11;
}
queue<int>q=hand;
while (!q.empty())
{
tmp.v[cnt++]=q.front();
q.pop();
}
tmp.v[cnt]=11;
if(st[tmp])
return -1;
else
st[tmp]=1;
}
else
return 0;
}
}
return 0;
}
int main()
{
int card;
while(scanf("%d",&card)&&card)
{
while (!hand.empty())
{
hand.pop();
}
st.clear();
for (int i = 0; i < N; i++)
piles[i].clear();
hand.push(card);
for(int i=0;i<51;i++)
{
scanf("%d",&card);
hand.push(card);
}
int tmp=solve();
if (tmp == 0)
printf ("Loss: %d\n", ans);
else if (tmp == 1)
printf ("Win : %d\n", ans);
else
printf ("Draw: %d\n", ans); }
}
UVA 246 10-20-30的更多相关文章
- UVA 246 - 10-20-30 (模拟+STL)
UVA 246 - 10-20-30 题目链接 题意:给52张的扑克堆,先从左往右发7张牌,之后连续不断从左往右发7张牌,假设有牌堆形成了下面3种情况(按顺序推断): 1.头两张+尾一张和为10或20 ...
- 背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换
[源码下载] 背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换 作者:webabcd 介 ...
- (转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html)WebWork深入浅出
(转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html) WebWork深入浅出 本文发表于<开源大本营> 作者:钱安 ...
- Scrum会议10.20
Scrum会议 组名称:好好学习 项目名称:记账本 参会成员:林莉(Master)胡丽娜 汪东涵 宫丽君 时间:2016.10.20 已完成内容: 1.理解项目和代码. 2.讨论新功能. 计划完成 ...
- 2016年10月30日 星期日 --出埃及记 Exodus 19:15
2016年10月30日 星期日 --出埃及记 Exodus 19:15 Then he said to the people, "Prepare yourselves for the thi ...
- 我的新计划 《2Dof Racing Simulator》2014/3/9 20:30:00
最近好久都没来网站上了,也没心思和时间去弄VellLock和升级V&View了.一直在蕴量这做一件大玩意. 最近一直都很忙,忙着做数电课设,还有各种实验,可是我的心思不在这些东西上,当然除了数 ...
- 查询数据库:models.Books.objects.all()[10: 20]与models.Books.objects.filter(id__gt=10, id__lt=20).values() 的区别
1. models.Books.objects.all()[10: 20] (10:20 之间是冒号,不是逗号.)查出的是 QuerySet对象,如需进行操作,得进一步进行剥皮. 查询代码: 查询结 ...
- OSC Source Code Innovation Salon(2018.10.20)
时间:2018.10.20地点:北京 朝阳 浦项中心B座2层
- 10 月 30 日新款 Mac mini 有望与新款 iPad Pro 一起发布
苹果最新款的 Mac mini 是在 2014 年 10 月推出的版本,到现在已经过了 4 年.分析师郭明錤和彭博社的 Mark Gurman 都表示苹果会在今年晚些时候发布新款 Mac mini. ...
- 第8次Scrum会议(10/20)【欢迎来怼】
一.小组信息 队名:欢迎来怼 小组成员 队长:田继平 成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华 小组照片 二.开会信息 时间:2017/10/20 17:20~17:45,总计25min. 地点 ...
随机推荐
- 多线程:pthread_exit,pthread_join,pthread_self
/*exit_join_id.c*/ #include<pthread.h> #include<stdio.h> void* eji(void* agr) { printf(& ...
- [Manacher][HDU3613][Best Reward]
题意: 将一段字符串 分割成两个串 如果分割后的串为回文串,则该串的价值为所有字符的权值之和(字符的权值可能为负数),否则为0. 问如何分割,使得两个串权值之和最大 思路: 裸的: 枚举分割点,计算, ...
- 每日一发linux命令
很多用虚拟机的同学在向/tmp目录下进行解压的时候,会发现之前挂载的此目录空间不足,导致下一步无法进行(我在vmwaretools解压的时候就遇到了这个problem)…… 实际上,/tmp是可以进行 ...
- <audio> 标签简介
定义和用法 <audio> 标签定义声音,比如音乐或其他音频流. 实例 一段简单的 HTML 5 音频: <audio src="someaudio.wav"&g ...
- 使用 Camtasia Recorder显示 “ camtasia an error occurred in the recorder: video codec open failed ”
这是因为本机没有codec的缘故,可以下载一个:tscc解码器(TechSmith Screen Capture Codec) 2.0.3.0 安装版 http://www.cngr.cn/dir/2 ...
- MVC 笔记(二)
HttpUtility.HtmlEncode来预处理用户输入,这能阻止用户向视图中用链接注入js代码或html标记 .[Required]:非空验证 .[StringLength(**)]:设置字符的 ...
- Oops信息及栈回溯
1. Oops信息来源及格式Oops这个单词含义为“惊讶”,当内核出错时(比如访问非法地址)打印出来的信息被称为Oops信息.Oops信息包含以下几部分内容:(1)一段文本描述信息. 比如类 ...
- WCF宿主实践入门
本篇属于WCF实践入门,由于博主本人水平有限,没有理论上的介绍,仅仅从其几种不同的宿主方式分别介绍WCF的使用. WCF有多种宿主方式:1.自托管宿主,2.windows service宿主,3.II ...
- ORACLE集合常用方法
集合方法pl/sql预定义了在varray 和嵌套表实例上进行调用的方法.这些方法能在集合上执行一定的功能. EXISTS 该函数返回集合中第一个元素的索引,如果集合为空,返回NULL Collect ...
- 两阶段提交及JTA
两阶段提交及JTA 分布式事务 分布式事务简介 分布式事务是指会涉及到操作多个数据库(或者提供事务语义的系统,如JMS)的事务.其实就是将对同一数据库事务的概念扩大到了对多个数据库的事务.目的是为了保 ...