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. 地点 ...
随机推荐
- 树的直径 poj 2631
树的直径:从随意一点出发,BFS找到最远的距离,然后在从该点出发BFS找到最远的距离 #include <iostream> #include <algorithm> #inc ...
- 点滴记录——Centos 6.5 yum安装Ganglia
转载请说明出处:http://blog.csdn.net/cywosp/article/details/39701141 注:下面操作都仅仅是在一台机器上操作 1. 安装php支持 yum inst ...
- AFNetworking之多图片-文件上传
在分享经验之前,先说点题外话,之前的一个项目涉及到了多图片的上传,本来以为是一个很简单的事情,却着实困扰了我好久,究其原因,一是我不够细心,二是与后台人员的交流不够充分.在此,我想将我的老师常说的一句 ...
- php单例设计模式
class car { static $obj = null; private function __construct(){} static function getObj(){ if(is_nul ...
- 垃圾回收器 Dispose 和 Finalize 的互补作用
假如我们程序有两个窗口 Form1.Form2; 当我们关闭一个窗口的时候,会发出一个 终止响应,并将该窗口对象送入终止队列,公共语言运行库的垃圾回收器跟踪着这个对象的生存期,此时就会调用此对象的基类 ...
- juce viewport使用
1.设置内容组件 void PropertyPanel::init() { messageWhenEmpty = TRANS("(nothing selected)"); addA ...
- 班上有学生若干名,已知每名学生的成绩(整数),求班上所有学生的平均成绩,保留到小数点后两位。同时输出该平均成绩整数部分四舍五入后的数值。 第一行有一个整数n(1<= n <= 100),表示学生的人数。其后n行每行有1个整数,表示每个学生的成绩,取值在int范围内。
#include<iostream> #include<iomanip> using namespace std ; int main() { int n; while(cin ...
- 关于datetime和int 是否可为null的问题
一个对象的属性中有一个datetime类型的属性,在赋值时未给予赋值,此时系统会分配给它一个最小的时间,不会是null值,与int类型相似,datetime也不会有null类型, 先来看一段代码: n ...
- Ubuntu14.04安装配置SVN及Trac
还是个实习生的时候,项目管理十分欠缺,会出现很多问题,痛定思痛,决定要改变现状,养成良好的项目管理习惯,看网上工具很多,在这里尝试使用SVN作代码版本控制,使用trac作为项目管理追踪.本文采用的操作 ...
- JVM GC之一找出不可达对象并回收
JAVA运行时数据区域 1.程序计数器:当前线程所执行的字节码的行号指示器.一个处理器只会执行一条线程中的指令,为了线程切换后能回复到正确的执行位置,所以每条线程都需要一个独立的计数器.各条线程之间互 ...