#include <cstdio> #include <cstring> #include <cmath> #include <map> #include <queue> #include <stack> #include <iostream> #include <algorithm> using namespace std; const int maxn=110; char c[maxn],e[maxn]; int a[maxn*4],b[maxn*4],f[maxn*4],t; int st,en,st2,en2,x; void addq(int q) { int j; if(q&1) { for(j=st2+1;j<=en2;j++) f[t++]=b[j]; } else { for(j=en2;j>st2;j--) f[t++]=b[j]; } } void addp(int p) { int j; if(p&1) { for(j=st+1;j<=en;j++) f[t++]=a[j]; } else { for(j=en;j>st;j--) f[t++]=a[j]; } } int main() { int n,tt=0; while(cin>>n) { if(n==0)break; int i,j,k,m,p=0,q=0; cin>>c>>e; for(i=0;i<n-1;i++) if(e[i]=='L')p++; else q++; for(i=0;i<p;i++) if((p-i)&1) c[i]=c[i]=='U'?'D':'U'; for(i=1;i<=q;i++) if((q-i+1)&1) c[n-i]=c[n-i]=='U'?'D':'U'; st=en=st2=en2=200; for(i=1;i<=p;i++) { if(i&1)a[st--]=i; else a[++en]=i; } for(i=1;i<=q;i++) { if(i&1)b[st2--]=n-i+1; else b[++en2]=n-i+1; } t=0; if(e[n-2]=='R') { addq(q); addp(p); f[t++]=p+1; } else { addp(p); addq(q); f[t++]=p+1; } cout<<"Pile "<<++tt<<endl; cin>>m; while(m--) { cin>>x; cout<<"Card "<<x<<" is a face "<<(c[f[x-1]-1]=='U'?"up ":"down ")<<f[x-1]<<"."<<endl; } } return 0; } /* 题意,将n张牌横向排开,从左到右编号1~n。输入正反情况,之后输入n-1次变化,变化L是将最左边的牌堆翻转覆盖到第二左的牌堆上; 同理R是从右开始。最后会成一堆牌。接着输入m个提问x,问从上到下第x张牌的情况。 方法:思考可知,结果和L和R的顺序,可以直接模拟。我是找规律解得,根据L和R的个数p和q确定了n张牌翻转后的正反情况。接着前p张牌翻转必定 是先是奇数后偶数,奇数递减,偶数递增。或者牌的顺序逆序下。同理得到后q张的情况。最后根据最后一次的翻转确定p堆在上还是q堆在上 */