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[];
char cz[];
int a[];
int res[];
stack<int>cardl1;
stack<int>cardl2;
stack<int>cardr1;
stack<int>cardr2; int main()
{
int N,n;
int k=;
int r,l,t;
int i,j;
while(scanf("%d",&N)!=EOF)
{
if(N==)
break;
k++;
scanf("%s",zt);
scanf("%s",cz);
scanf("%d",&n);
for(i=;i<n;i++)
{
scanf("%d",&a[i]);
}
cout<<"Pile "<<k<<endl;
cardl1.push();
cardr1.push(N);
r=N-;
l=;
for(i=;i<N-;i++)
{
if(cz[i]=='R')
{
for(j=r;j<N;j++)
{
if(zt[j]=='U')
zt[j]='D';
else
zt[j]='U';
}
r=r-;
if(i==N-)
break;
if(cardr2.empty())
{
cardr2.push(r+);
while(!cardr1.empty())
{
t=cardr1.top();
cardr1.pop();
cardr2.push(t);
}
}
else
{
cardr1.push(r+);
while(!cardr2.empty())
{
t=cardr2.top();
cardr2.pop();
cardr1.push(t);
}
}
}
else
{
for(j=l;j>=;j--)
{
if(zt[j]=='U')
zt[j]='D';
else
zt[j]='U';
}
l=l+;
if(i==N-)
break;
if(cardl2.empty())
{
cardl2.push(l+);
while(!cardl1.empty())
{
t=cardl1.top();
cardl1.pop();
cardl2.push(t);
}
}
else
{
cardl1.push(l+);
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-]=='R')
{
while(!cardr2.empty())
{
t=cardr2.top();
cardr2.pop();
cardl2.push(t);
}
for(i=;!cardl2.empty();i++)
{
res[i]=cardl2.top();
cardl2.pop();
}
}
else
{
while(!cardl2.empty())
{
t=cardl2.top();
cardl2.pop();
cardr2.push(t);
}
for(i=;!cardr2.empty();i++)
{
res[i]=cardr2.top();
cardr2.pop();
}
}
}
else
{
if(cz[N-]=='R')
{
while(!cardr1.empty())
{
t=cardr1.top();
cardr1.pop();
cardl2.push(t);
}
for(i=;!cardl2.empty();i++)
{
res[i]=cardl2.top();
cardl2.pop();
}
}
else
{
while(!cardl2.empty())
{
t=cardl2.top();
cardl2.pop();
cardr1.push(t);
}
for(i=;!cardr1.empty();i++)
{
res[i]=cardr1.top();
cardr1.pop();
}
}
}
}
else
{
if(!cardr2.empty())
{
if(cz[N-]=='R')
{
while(!cardr2.empty())
{
t=cardr2.top();
cardr2.pop();
cardl1.push(t);
}
for(i=;!cardl1.empty();i++)
{
res[i]=cardl1.top();
cardl1.pop();
}
}
else
{
while(!cardl1.empty())
{
t=cardl1.top();
cardl1.pop();
cardr2.push(t);
}
for(i=;!cardr2.empty();i++)
{
res[i]=cardr2.top();
cardr2.pop();
}
}
}
else
{
if(cz[N-]=='R')
{
while(!cardr1.empty())
{
t=cardr1.top();
cardr1.pop();
cardl1.push(t);
}
for(i=;!cardl1.empty();i++)
{
res[i]=cardl1.top();
cardl1.pop();
}
}
else
{
while(!cardl1.empty())
{
t=cardl1.top();
cardl1.pop();
cardr1.push(t);
}
for(i=;!cardr1.empty();i++)
{
res[i]=cardr1.top();
cardr1.pop();
}
}
}
}
//for(i=0;i<N;i++)
//{
// cout<<res[i]<<endl;
//}
for(i=;i<n;i++)
{
cout<<"Card "<<a[i]<<" is a face ";
if(zt[res[a[i]-]-]=='U')
cout<<"up ";
else
cout<<"down ";
cout<<res[a[i]-]<<"."<<endl;
}
}
return ;
}
A出来之后和集训队里的大神讨论,这题他用的数组模拟写起来要比我的方法快= ="一般的用数组模拟栈就是int stk[MAXN],top;压栈的话,比如压个1就是 stk[top++]=1;退栈就是a=stk[--top];"以上大神原话→_→
HDU 3328 Flipper 栈 模拟的更多相关文章
- HDU 3328 Flipper
题解:直接建n个栈,模拟过程即可…… #include <cstdio> #include <cstring> #include <stack> using nam ...
- HDU 3328 Flipper (stack)
最近着手打基础,做做STL的题目,虽然一般STL题目难度不大,但需要加快速度的准确率............................. 本题有N张牌,一开始每个位置一张(正面朝上或者朝下),有 ...
- HDU 1022 Train Problem I(栈模拟)
传送门 Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of st ...
- UVALive 7454 Parentheses (栈+模拟)
Parentheses 题目链接: http://acm.hust.edu.cn/vjudge/contest/127401#problem/A Description http://7xjob4.c ...
- UVALive 3486/zoj 2615 Cells(栈模拟dfs)
这道题在LA是挂掉了,不过还好,zoj上也有这道题. 题意:好大一颗树,询问父子关系..考虑最坏的情况,30w层,2000w个点,询问100w次,貌似连dfs一遍都会TLE. 安心啦,这肯定是一道正常 ...
- poj1363Rails(栈模拟)
主题链接: id=1363">啊哈哈,点我点我 思路: 这道题就是一道简单的栈模拟. .. .我最開始认为难处理是当出栈后top指针变化了. .当不满足条件时入栈的当前位置怎么办.这时 ...
- 【LintCode·容易】用栈模拟汉诺塔问题
用栈模拟汉诺塔问题 描述 在经典的汉诺塔问题中,有 3 个塔和 N 个可用来堆砌成塔的不同大小的盘子.要求盘子必须按照从小到大的顺序从上往下堆 (如:任意一个盘子,其必须堆在比它大的盘子上面).同时, ...
- 51Nod 1289 大鱼吃小鱼 栈模拟 思路
1289 大鱼吃小鱼 栈模拟 思路 题目链接 https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1289 思路: 用栈来模拟 ...
- Code POJ - 1780(栈模拟dfs)
题意: 就是数位哈密顿回路 解析: 是就算了...尼玛还不能直接用dfs,得手动开栈模拟dfs emm...看了老大半天才看的一知半解 #include <iostream> #inclu ...
随机推荐
- [Java面试十一]数据库总结.
问题及描述: --1.学生表 Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course ...
- Atitit 图像处理知识点 知识体系 知识图谱v2
Atitit 图像处理知识点 知识体系 知识图谱v2 霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像 ...
- salesforce 零基础学习(二十八)使用ajax方式实现联动
之前的一篇介绍过关于salesforce手动配置关联关系实现PickList的联动效果,但是现实的开发中,很多数据不是定死的,应该通过ajax来动态获取,本篇讲述通过JavaScript Remoti ...
- python学习 文件操作
一.python打开文件 #=====================python 文件打开方式 open()===================== # open(fileName,type) t ...
- IOS开发之控件篇UITabBarControllor第二章 - 遮掩TableView问题
在IOS7.0以后UITabBar 里面放入一个UITableView会出现一个问题,Table会被TabBar掩盖了,当移动到最后一项的时候,永远看不到,如下面的例子,总共是99项,但是只能显示到9 ...
- JSON学习之二
1.JSON语法是JavaScript对象表示法的子集,语法规则: **数据在名称/值对中 **数据由逗号分隔 **花括号保存对象 **方括号保存数组 2.JSON名称/值对:JSON数据的书写格式是 ...
- writing-mode改变文字书写方式
古代书写方式都是垂直方向上的,如果要实现这种效果的话,还是挺麻烦的,不过现在CSS3有一个"writing-mode"属性,它可以改变文字的书写方式. writing-mode:h ...
- Sublime Text2 Jsformat自定义使用之代码折叠方式修改
将代码括号的折叠方式从 function abc(){ } 变成 function abc() { } 打开 Setting-user,把setting-default里的文本全部复制过来. 然后 将 ...
- Android入门(二十)HttpURLConnection与HttpClient
原文链接:http://www.orlion.ga/679/ 在 Android上发送 HTTP请求的方式一般有两种,HttpURLConnection和 HttpClient. 一.HttpURLC ...
- ES6入门系列三(特性总览下)
0.导言 最近从coffee切换到js,代码量一下子变大了不少,也多了些许陌生感.为了在JS代码中,更合理的使用ES6的新特性,特在此对ES6的特性做一个简单的总览. 1.模块(Module) --C ...