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];"以上大神原话→_→
转载于:https://www.cnblogs.com/lmhbk/p/5787419.html
HDU 3328 Flipper 栈 模拟相关推荐
- HDU 3328 Flipper 魔术纸牌
原题 http://acm.hdu.edu.cn/showproblem.php?pid=3328 题目: Flipper Time Limit: 2000/1000 MS (Java/Others) ...
- 每日一套codeforce集训1119E[贪心],821C[栈模拟],645D[拓扑排序]
有n种长度的棍子,长度分别为2^0 ,2 ^ 1,-,2 ^ (n-1) ,每种棍子有a[i] 种,问你能组成多少个三角形. 三角形两边之和大于第三边,而2 ^ i + 2 ^ i = 2 ^ (i+ ...
- P1944 最长括号匹配(栈模拟/DP)
P1944 最长括号匹配 可以直接用栈模拟,把匹配好的标记一下, 最后找到最长的匹配输出即可. 如果是要求最长的长度的题那么只需要求数就行了,没必要把原序列真的按照题意改变 如果要求序列,那么只需要按 ...
- 【干货】容器适配器实现两个栈模拟队列
用两个栈模拟队列的思想就是"倒水思想",这里我们用自定义类型模拟出线性表,再用线性表做容器实现栈的数据结构,最后用栈来实现队列,代码如下: #include<iostream ...
- Code POJ - 1780(栈模拟dfs)
题意: 就是数位哈密顿回路 解析: 是就算了...尼玛还不能直接用dfs,得手动开栈模拟dfs emm...看了老大半天才看的一知半解 #include <iostream> #inclu ...
- 括号配对问题----栈模拟
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100), ...
- 227 用栈模拟汉诺塔问题
原题网址:https://www.lintcode.com/problem/mock-hanoi-tower-by-stacks/description 描述 在经典的汉诺塔问题中,有 3 个塔和 N ...
- 栈模拟递归 遍历二叉树的正确写法
栈模拟递归 遍历二叉树的正确写法 二叉树的生成 树的层次遍历 前中后序遍历的递归实现 关于栈的实现 Reference 对于二叉树的生成,遍历,应该是树这个数据结构需要的基本功,只有真的理解了树的生成 ...
- 基础算法4 —— 结构体(成绩统计) + 栈(模拟进制转换 + 优秀的拆分) + 指针
结构体 结构体的实际应用场景: 在实际问题中,一组数据往往具有不同的数据类型.比如,某次期末考试中要记录一个学生的考试信息,除了有姓名(char)外,还有班级(int).性别(char).语文.数学. ...
最新文章
- ECMAScript 6 Features 中文版
- 邓侃:深度强化学习“深”在哪里?
- Centos6.5安装Kibana
- 图片链接生成器软件_推荐10个小众但是黑科技十足的Windows软件
- Docker Compose配置springboot微服务项目
- java属于以下哪种语言_Java属于以下哪种语言?
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除)...
- 乐搏讲自动化测试-Python发展背景(1)
- 服务器图纸被自动删除,JavaWeb项目图片消失的原因之一————服务器上图片目录被误删...
- (转载)python日期函数
- 精通Javascript+jQuery视频下载地址
- 声网 X Yalla:面对面不如线上见,中东年轻人最偏爱的语聊房是怎样“炼”成的?
- 数据归档神器-pt-archiver
- Linux之core dumped出错原因及位置分析
- oracle查询数据令某字段显示固定值
- 【arc075f】AtCoder Regular Contest 075 F - Mirrored
- java.exe,javac.exe,javaw.exe 是什么进程? (转载)
- MTK平台替换签名key方法
- 移动应用开发的未来是什么?——六大趋势指引企业顺水行舟
- python画三角形