题意:给定n张卡片,'U'表示该卡片正面朝上,'D'表示朝下
给定n-1个操作,'L'表示最左边的卡片集翻转并且叠放到相邻右边一个卡片集上面,如第1个卡片集翻转叠放到第2个卡
片集上
'R'表示最右端的卡片集翻转并且叠放到相邻左边一个卡片集上面,最终只会剩余一叠卡片
对这叠卡片接下来有m个询问,询问从上到下第a张卡片的序号和正面的方向
链接 :UVALive4536 POJ3824 HDU3328 Flipper
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
stack<int> stac[100+10];
int main(){
int price=0,n,i,flag[100+10];
string str1,str2;
while(cin>>n,n){
cin>>str1>>str2;
i=0;
while(str1[i]){
if(str1[i]=='U') flag[i] = 1 ;
else flag[i] = 0 ;
i++;
}
for(int j=0;j<n;j++){
stac[j].push(j+1);
}
int left=0,right=n-1;
i=0;
for(;i<n-1;){
if(str2[i]=='R'){
right--;
for(int j=n-1;j>right;j--)
flag[j]=1-flag[j];
while(!stac[right+1].empty()){
stac[right].push(stac[right+1].top());
stac[right+1].pop();
}
}
if(str2[i]=='L'){
left++;
for(int j=0;j<left;j++)
flag[j]=1-flag[j]; //翻转
while(!stac[left-1].empty()){
stac[left].push(stac[left-1].top());
stac[left-1].pop();
}
}
i++;
}
int t,m,a[100+10];
for(int j=0;j<n;j++){
a[j]=stac[left].top();//数组 a 存储的数据 比脚标 大 1 所以 flag[a[j]-1]才是 第j张牌的正反情况
stac[left].pop();
}
cout<<"Pile "<<++price<<endl;
cin>>m;
while(m--){
cin>>t;
printf("Card %d is a face %s %d.\n",t,(flag[a[t-1]-1]?"up":"down"),a[t-1]);//记录是从0开始的,即存储的比获取的少1
}
}
return 0;
}