UVA-127 "Accordian" Patience (模拟)
2024-08-25 13:42:18
题目大意:一种纸牌游戏,将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;
}
最新文章
- Duilib源码分析(一)整体框架
- python学习4 常用内置模块
- HTML5中的 Canvas
- git忽略某些文件
- ZOJ2314 Reactor Cooling
- HDU3507 print artical
- 关于Windows Azure的常见问题-执行与维护FAQ
- windows下练习linux shell
- 基于配置文件的Spring注入
- luogu3278/bzoj3323 多项式的运算 (splay)
- Liunx系统命令sed的使用
- PHP学习笔记(二)
- October 15th 2017 Week 42nd Sunday
- Gulp:插件编写入门
- web中浏览PDF文件
- Git----02本地仓库进行文件添加&;修改&;删除&;查看
- LeetCode——Find Minimum in Rotated Sorted Array
- mac制作U盘启动器
- DOM操作相关案例 模态对话框,简易留言板,js模拟选择器hover,tab选项卡,购物车案例
- 前端学习blog