HDU 3328 Flipper 栈 模拟

首先想说,英语太烂这题读了很长时间才读懂......题意是说输入有几张牌,然后输入这些牌的初始状态(是面朝上还是面朝下),然后输入操作方式,R表示翻一下右边的牌堆,L表示翻一下左边的牌堆,直到最后摞成了一个牌堆。后面跟着一排问题,输入i,问从上往下数的第i张牌编号,以及这张牌的状态。

这题只要读懂了题意思路也挺清晰的了,用栈进行模拟一步一步走就行了,我的思路是先对牌的状态进行计算,如果是R,就把这一步右边所有牌都翻过来,如果是L,就把这一步左边所有牌都翻过来,这样先把所有牌编号和状态都对应好了,这一步不难。

然后再处理牌的上下顺序,这一步就要用到栈了,因为每次翻牌牌的顺序都会完全翻过来,所以用两个栈,每翻一次就翻到另一个空栈里去,因为这题左边右边都在翻,所以我开了四个栈,左边两个右边两个,左边翻的时候就把左边非空栈里的内容一个一个移到左边的空栈里,这样就模拟了翻牌的过程,右边也是一样处理。这样到最后就是左边一堆牌,右边一堆牌(左边剩一个非空栈,右边剩一个非空栈),然后再考虑最后一步是左翻还是右翻,左翻就把左边栈里的清到右边栈里,右翻反之。最后剩下的一个栈就是模拟的翻完之后的顺序了。然后开一个数组再把这个栈里的元素按顺序存在数组里以方便查找,这样四个栈也都清空了,每次跑循环不必再刻意去清空了。

这样状态与顺序都排好了放进了数组里,再问哪一个顺序的牌,直接把数组拉出来cout就可以了,下面是我写的代码,有点长,其实思路挺简短= =就是再判断是不是空栈的时候我一直再用if else所以排的情况太多了导致了代码太长......

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
char zt[105];
char cz[105];
int a[105];
int res[105];
stack<int>cardl1;
stack<int>cardl2;
stack<int>cardr1;
stack<int>cardr2;int main()
{int N,n;int k=0;int r,l,t;int i,j;while(scanf("%d",&N)!=EOF){if(N==0)break;k++;scanf("%s",zt);scanf("%s",cz);scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&a[i]);}cout<<"Pile "<<k<<endl;cardl1.push(1);cardr1.push(N);r=N-1;l=0;for(i=0;i<N-1;i++){if(cz[i]=='R'){for(j=r;j<N;j++){if(zt[j]=='U')zt[j]='D';elsezt[j]='U';}r=r-1;if(i==N-2)break;if(cardr2.empty()){cardr2.push(r+1);while(!cardr1.empty()){t=cardr1.top();cardr1.pop();cardr2.push(t);}}else{cardr1.push(r+1);while(!cardr2.empty()){t=cardr2.top();cardr2.pop();cardr1.push(t);}}}else{for(j=l;j>=0;j--){if(zt[j]=='U')zt[j]='D';elsezt[j]='U';}l=l+1;if(i==N-2)break;if(cardl2.empty()){cardl2.push(l+1);while(!cardl1.empty()){t=cardl1.top();cardl1.pop();cardl2.push(t);}}else{cardl1.push(l+1);while(!cardl2.empty()){t=cardl2.top();cardl2.pop();cardl1.push(t);}}}}//cout<<zt<<endl;//while(!cardl2.empty())//{//   cout<<cardl2.top()<<endl;//    cardl2.pop();//}if(!cardl2.empty()){if(!cardr2.empty()){if(cz[N-2]=='R'){while(!cardr2.empty()){t=cardr2.top();cardr2.pop();cardl2.push(t);}for(i=0;!cardl2.empty();i++){res[i]=cardl2.top();cardl2.pop();}}else{while(!cardl2.empty()){t=cardl2.top();cardl2.pop();cardr2.push(t);}for(i=0;!cardr2.empty();i++){res[i]=cardr2.top();cardr2.pop();}}}else{if(cz[N-2]=='R'){while(!cardr1.empty()){t=cardr1.top();cardr1.pop();cardl2.push(t);}for(i=0;!cardl2.empty();i++){res[i]=cardl2.top();cardl2.pop();}}else{while(!cardl2.empty()){t=cardl2.top();cardl2.pop();cardr1.push(t);}for(i=0;!cardr1.empty();i++){res[i]=cardr1.top();cardr1.pop();}}}}else{if(!cardr2.empty()){if(cz[N-2]=='R'){while(!cardr2.empty()){t=cardr2.top();cardr2.pop();cardl1.push(t);}for(i=0;!cardl1.empty();i++){res[i]=cardl1.top();cardl1.pop();}}else{while(!cardl1.empty()){t=cardl1.top();cardl1.pop();cardr2.push(t);}for(i=0;!cardr2.empty();i++){res[i]=cardr2.top();cardr2.pop();}}}else{if(cz[N-2]=='R'){while(!cardr1.empty()){t=cardr1.top();cardr1.pop();cardl1.push(t);}for(i=0;!cardl1.empty();i++){res[i]=cardl1.top();cardl1.pop();}}else{while(!cardl1.empty()){t=cardl1.top();cardl1.pop();cardr1.push(t);}for(i=0;!cardr1.empty();i++){res[i]=cardr1.top();cardr1.pop();}}}}//for(i=0;i<N;i++)//{//   cout<<res[i]<<endl;//}for(i=0;i<n;i++){cout<<"Card "<<a[i]<<" is a face ";if(zt[res[a[i]-1]-1]=='U')cout<<"up ";elsecout<<"down ";cout<<res[a[i]-1]<<"."<<endl;}}return 0;
}

View Code

A出来之后和集训队里的大神讨论,这题他用的数组模拟写起来要比我的方法快= ="一般的用数组模拟栈就是int stk[MAXN],top;压栈的话,比如压个1就是 stk[top++]=1;退栈就是a=stk[--top];"以上大神原话→_→

posted on 2016-08-19 14:11 暖黑色 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lmhbk/p/5787419.html

HDU 3328 Flipper 栈 模拟相关推荐

  1. HDU 3328 Flipper 魔术纸牌

    原题 http://acm.hdu.edu.cn/showproblem.php?pid=3328 题目: Flipper Time Limit: 2000/1000 MS (Java/Others) ...

  2. 每日一套codeforce集训1119E[贪心],821C[栈模拟],645D[拓扑排序]

    有n种长度的棍子,长度分别为2^0 ,2 ^ 1,-,2 ^ (n-1) ,每种棍子有a[i] 种,问你能组成多少个三角形. 三角形两边之和大于第三边,而2 ^ i + 2 ^ i = 2 ^ (i+ ...

  3. P1944 最长括号匹配(栈模拟/DP)

    P1944 最长括号匹配 可以直接用栈模拟,把匹配好的标记一下, 最后找到最长的匹配输出即可. 如果是要求最长的长度的题那么只需要求数就行了,没必要把原序列真的按照题意改变 如果要求序列,那么只需要按 ...

  4. 【干货】容器适配器实现两个栈模拟队列

    用两个栈模拟队列的思想就是"倒水思想",这里我们用自定义类型模拟出线性表,再用线性表做容器实现栈的数据结构,最后用栈来实现队列,代码如下: #include<iostream ...

  5. Code POJ - 1780(栈模拟dfs)

    题意: 就是数位哈密顿回路 解析: 是就算了...尼玛还不能直接用dfs,得手动开栈模拟dfs emm...看了老大半天才看的一知半解 #include <iostream> #inclu ...

  6. 括号配对问题----栈模拟

    括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100), ...

  7. 227 用栈模拟汉诺塔问题

    原题网址:https://www.lintcode.com/problem/mock-hanoi-tower-by-stacks/description 描述 在经典的汉诺塔问题中,有 3 个塔和 N ...

  8. 栈模拟递归 遍历二叉树的正确写法

    栈模拟递归 遍历二叉树的正确写法 二叉树的生成 树的层次遍历 前中后序遍历的递归实现 关于栈的实现 Reference 对于二叉树的生成,遍历,应该是树这个数据结构需要的基本功,只有真的理解了树的生成 ...

  9. 基础算法4 —— 结构体(成绩统计) + 栈(模拟进制转换 + 优秀的拆分) + 指针

    结构体 结构体的实际应用场景: 在实际问题中,一组数据往往具有不同的数据类型.比如,某次期末考试中要记录一个学生的考试信息,除了有姓名(char)外,还有班级(int).性别(char).语文.数学. ...

最新文章

  1. ECMAScript 6 Features 中文版
  2. 邓侃:深度强化学习“深”在哪里?
  3. Centos6.5安装Kibana
  4. 图片链接生成器软件_推荐10个小众但是黑科技十足的Windows软件
  5. Docker Compose配置springboot微服务项目
  6. java属于以下哪种语言_Java属于以下哪种语言?
  7. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除)...
  8. 乐搏讲自动化测试-Python发展背景(1)
  9. 服务器图纸被自动删除,JavaWeb项目图片消失的原因之一————服务器上图片目录被误删...
  10. (转载)python日期函数
  11. 精通Javascript+jQuery视频下载地址
  12. 声网 X Yalla:面对面不如线上见,中东年轻人最偏爱的语聊房是怎样“炼”成的?
  13. 数据归档神器-pt-archiver
  14. Linux之core dumped出错原因及位置分析
  15. oracle查询数据令某字段显示固定值
  16. 【arc075f】AtCoder Regular Contest 075 F - Mirrored
  17. java.exe,javac.exe,javaw.exe 是什么进程? (转载)
  18. MTK平台替换签名key方法
  19. 移动应用开发的未来是什么?——六大趋势指引企业顺水行舟
  20. python画三角形

热门文章

  1. 二胎妈妈,35岁,年薪70万,家庭工作平衡太难,要不要辞职?
  2. 女生天天和我微信语音5小时以上,突然没有联系,应该怎么办?
  3. 高人,不断地在营销, 有收入就是高人
  4. 揭秘富人见不得光的第一桶金都是怎么来的
  5. 年轻人应该拥有怎样的财富观?
  6. 寻找点赞所需的URL
  7. 如何评价NVIDIA RTX 2080 Ti显卡?
  8. 魅族智能识屏怎么用才算是高科技?
  9. [leetcode] Max Points on a Line 判断最多有多少个点在同一条直线上
  10. SQL Server中的功能与存储过程