UVA-127 "Accordian" Patience (模拟)
题目大意:一种纸牌游戏,将52张扑克牌排成一列,每次操作可将一张扑克牌移到它的前一张或前面第三张上当牌的点数或花色匹配时。每次都移动最靠左的扑克牌,并且能移动三格就移动三格。求最终扑克牌状态。
题目分析:利用栈这种数据结构模拟,以为会超时,没想到AC了。
代码如下:
# include<iostream>
# include<cstdio>
# include<map>
# include<stack>
# include<cstring>
# include<algorithm>
using namespace std; struct Poke
{
char v,f;
Poke(char _v,char _f):v(_v),f(_f){}
};
char str[2];
stack<Poke>s[52]; int get(int pos,int k)
{
for(int i=pos-1;i>=0;--i){
if(!s[i].empty()){
--k;
if(k==0) return i;
}
}
return -1;
} bool match(const Poke &a,const Poke &b)
{
return a.v==b.v||a.f==b.f;
} bool toDo(int i,int k)
{
Poke a=s[i].top();
Poke b=s[k].top();
if(match(a,b)){
s[k].push(a);
s[i].pop();
return true;
}
return false;
} void solve()
{
int i;
while(1)
{
for(i=1;i<52;++i){
if(s[i].empty())
continue;
int k=get(i,3);
if(k!=-1&&toDo(i,k))
break;
k=get(i,1);
if(k!=-1&&toDo(i,k))
break;
}
if(i>=52)
break;
}
} int main()
{
while(scanf("%s",str))
{
if(str[0]=='#')
break;
for(int i=0;i<52;++i)
while(!s[i].empty())
s[i].pop();
s[0].push(Poke(str[0],str[1]));
for(int i=1;i<52;++i){
scanf("%s",str);
s[i].push(Poke(str[0],str[1]));
Poke u=s[i].top();
}
solve();
int k=0;
for(int i=0;i<52;++i)
if(!s[i].empty())
++k;
if(k==1)
printf("1 pile remaining: 52\n");
else{
printf("%d piles remaining:",k);
for(int i=0;i<52;++i)
if(!s[i].empty())
printf(" %d",s[i].size());
printf("\n");
}
}
return 0;
}
UVA-127 "Accordian" Patience (模拟)的更多相关文章
- ACM学习历程——UVA 127 "Accordian" Patience(栈;模拟)
Description ``Accordian'' Patience You are to simulate the playing of games of ``Accordian'' patie ...
- UVa 127 - "Accordian" Patience
题目:52张扑克,从左到右在平面上排列,按着如下规则处理: 1.按照从左到右的顺序,如果一张牌和左边的第一张或者第三张匹配,就把它放到对应的牌上面. 2.如果可以移动到多个位置,移动到最左端的牌上面. ...
- Uva 127 poj 1214 `Accordian'' Patience 纸牌游戏 模拟
Input Input data to the program specifies the order in which cards are dealt from the pack. The inpu ...
- [刷题]算法竞赛入门经典(第2版) 6-9/UVa127 - "Accordian" Patience
题意:52张牌排一行,一旦出现任何一张牌与它左边的第一张或第三张"匹配",即花色或点数相同,则须立即将其移动到那张牌上面,将其覆盖.能执行以上移动的只有压在最上面的牌.直到最后没有 ...
- UVA127- "Accordian" Patience(模拟链表)
"Accordian" Patience You are to simulate the playing of games of ``Accordian'' patience, t ...
- ACM学习历程——UVA127 "Accordian" Patience(栈, 链表)
Description ``Accordian'' Patience You are to simulate the playing of games of ``Accordian'' patie ...
- UVa 127 - "Accordian" Patience POJ 1214 链表题解
UVa和POJ都有这道题. 不同的是UVa要求区分单复数,而POJ不要求. 使用STL做会比較简单,这里纯粹使用指针做了,很麻烦的指针操作,一不小心就错. 调试起来还是很费力的 本题理解起来也是挺费力 ...
- 【习题 6-9 UVA - 127】"Accordian" Patience
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 链表模拟即可. 1pile不能加s... [代码] #include <bits/stdc++.h> using nam ...
- UVA-127 "Accordian" Patience(模拟)
题目: 把52张牌从左到右排好,每张牌自成一个牌堆.当某张牌与它左边那张牌或者左边第三张牌匹配时(花色或者点数相同)时,就把这张牌移到那张牌上面. 移动之后还要查看是否可以进行其他移动.只有位于牌堆顶 ...
随机推荐
- 'module' object has no attribute 'select'
和tensorflow的版本有关系 新版本 将tf.select替换为tf.where
- linux 下创建虚拟环境 python
virtualenv是一个可以在同一计算机中隔离多个python版本的工具.有时,两个不同的项目可能需要不同版本的python,如 python2.7 / python3.6 ,但是如果都装到一起,经 ...
- mysql 约束条件 外键 forigen key 介绍
外键 forigen key作用 :建立表之间的关系 什么是外键 员工信息表有这些字段:id号 姓名 性别 员工所在部门名 部门描述信息 公司有3个部门,但是有1个亿的员工,那意味着 员工所对应的部 ...
- 通过html<map>标签给图片加链接
前面我们有谈到了通过图片定位给一张图片添加多个链接,现在用另外一种方法来实现,用html<map>标签给图片加链接 <img src="/images/hlj.jpg&qu ...
- Linux内核之vmlinux与vmlinuz
因为是初次系统的学习Linux内核,过程中遇到了一些常常出现的名词.似曾相识,但对他们的含义又不是非常清楚.因此,将搜索到的内容进行一下汇总. 1.vmlinux vmlinux是一个包括linu ...
- nmon 命令
nmon 命令 用途 以交互方式显示本地系统统计信息并以记录方式记录系统统计信息. 语法 交互方式: nmon [ -h ] nmon [ -s < seconds >] [ -c < ...
- PAT Sum of Number Segments[数学问题][一般]
1104 Sum of Number Segments(20 分) Given a sequence of positive numbers, a segment is defined to be a ...
- 使用jQuery包装节点
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- Linux系统——Inotify事件监控工具
每秒传输文件200个 Rsync放在定时任务中也只是一分钟执行一回,要想达到实时的效果,为防止单点nfs架构故障,再启动一台nfs服务器作为主nfs服务器的备份服务器,此时需要inotify实时同步数 ...
- C++11多线程教学
转自:http://www.cnblogs.com/lidabo/p/3908705.html 本篇教学代码可在GitHub获得:https://github.com/sol-prog/threads ...