#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堆在上
*/
hdu 3328 Flipper 模拟题
最新推荐文章于 2018-08-26 01:15:10 发布