0
点赞
收藏
分享

微信扫一扫

Flipper_模拟和栈


思路:(R为将最右边的牌全部翻转到离他最近的最左边的牌。同理L。)就是模拟处理卡牌,用栈很方便,定义一个结构体,直接记录初识卡牌数和卡牌的状态,每次R翻转还是L翻转,都对里面的进行状态转换。最后输出到一个数组里面,第几个数是什么卡牌,卡牌的状态是什么也很方便。)

​​Poj 38224 flipper​​

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<stack>
using namespace std;
const int maxn=110;
struct node{
int num;
bool flag;
};

//输出的数组,和翻转栈
int main()
{
int n,cnt=1;
node c;
string stu,flip;
while(cin>>n&&n)
{
node a[maxn];
stack<node>s[maxn];
cin>>stu>>flip;
//c初识化状态
for(int i=0;i<n;i++)
{
c.num=i+1;
if(stu[i]=='U')
c.flag=1;
else
c.flag=0;
s[i].push(c);//
}

int left=0,right=n-1;
//翻转处理
for(int i=0;i<n-1;i++)
{
if(flip[i]=='L')
{//右向左
int temp=left+1;
while(!s[left].empty())
{
c=s[left].top();
s[left].pop();
if(c.flag)
c.flag=0;
else
c.flag=1;
s[temp].push(c);
}
left=temp;
}
else if(flip[i]=='R')
{//z左向右
int temp=right-1;
while(!s[right].empty())
{
c=s[right].top();
s[right].pop();
if(c.flag)
c.flag=0;
else
c.flag=1;
s[temp].push(c);
}
right=temp;
}
}
for(int i=0;i<n;i++)
{
a[i]=s[left].top();
//cout<<a[i].flag<<endl;
s[left].pop();
}
cout<<"Pile "<<cnt++<<endl;
int m,k;
cin>>m;
while(m--)
{
cin>> k;
printf("Card %d is a face ", k);
k--;
printf("%s %d.\n",(a[k].flag?"up":"down"),a[k].num);
}
}
return 0;
}


举报

相关推荐

0 条评论