Problem Description
Little Bobby Roberts (son of Big Bob, of Problem G) plays this solitaire memory game called Flipper. He starts with
n
cards, numbered 1 through
n, and lays them out in a row with the cards in order left-to-right. (Card 1 is on the far left; card
n
is on the far right.) Some cards are face up and some are face down. Bobby then performs
n
- 1 flips — either right flips or left flips. In a right flip he takes the pile to the far right and flips it over onto the card to its immediate left. For example, if the rightmost pile has cards A, B, C (from top to bottom) and card D is to the immediate left, then flipping the pile over onto card D would result in a pile of 4 cards: C, B, A, D (from top to bottom). A left flip is analogous.
The very last flip performed will result in one pile of cards — some face up, some face down. For example, suppose Bobby deals out 5 cards (numbered 1 through 5) with cards 1 through 3 initially face up and cards 4 and 5 initially face down. If Bobby performs 2 right flips, then 2 left flips, the pile will be (from top to bottom) a face down 2, a face up 1, a face up 4, a face down 5, and a face up 3.
Now Bobby is very sharp and you can ask him what card is in any position and he can tell you!!! You will write a program that matches Bobby’s amazing feat.
Input
Each test case will consist of 4 lines. The first line will be a positive integer
n
(2 ≤
n
≤ 100) which is the number of cards laid out. The second line will be a string of
n
characters. A character U indicates the corresponding card is dealt face up and a character D indicates the card is face down. The third line is a string of
n
- 1 characters indicating the order of the flips Bobby performs. Each character is either R, indicating a right flip, or L, indicating a left flip. The fourth line is of the form
m q1 q2 . . . qm, where
m
is a positive integer and 1 ≤
qi
≤
n. Each
qi
is a query on a position of a card in the pile (1 being the top card,
n
being the bottom card). A line containing 0 indicates end of input.
Output
Each test case should generate
m
+ 1 lines of output. The first line is of the form
Pile t
where
t
is the number of the test case (starting at 1). Each of the next
m
lines should be of the form
Card qi is a face up k.
or
Card qi is a face down k.
accordingly, for
i
= 1, ..,
m, where
k
is the number of the card.
For instance, in the above example with 5 cards, if
qi
= 3, then the answer would be
Card 3 is a face up 4.
Sample Input
5
UUUDD
RRLL
5 1 2 3 4 5
10
UUDDUUDDUU
LLLRRRLRL
4 3 7 6 1
0
Sample Output
Pile 1
Card 1 is a face down 2.
Card 2 is a face up 1.
Card 3 is a face up 4.
Card 4 is a face down 5.
Card 5 is a face up 3.
Pile 2
Card 3 is a face down 1.
Card 7 is a face down 9.
Card 6 is a face up 7.
Card 1 is a face down 5.
题意:其实这题并不难,只是题意有点难理解
首先给出每张牌的初始状态,U为面朝上,D为面朝下,然后跟着几个操作,L代表从左边翻,R代表从右边翻
例如第一个样例,前两个R,代表最右边的5翻转,叠放到4上,然后这两张叠放的一起翻转,叠放到3上
剩下的两个L,代表最左边的1翻转,叠峰到2上,然后这两张再一起翻转,叠放到3,4,5形成的堆上,然后他们就成为了一堆
最后给出n询问,询问这一堆的第几张牌是什么状态
例如Card 1 is a face down 2.就是说这个堆的第一张牌是面朝下的2
思路:知道题意就可以直接开始模拟了
#include <stdio.h>
#include <string.h>
using namespace std;
struct node
{
int face,num;
}card[105][105];
int ip[105],work[105];
void turn(int x,int y)
{
int i;
for(i=ip[x];i>=1;i--)
{
if(card[x][i].face)//翻转的过程
card[x][i].face = 0;
else
card[x][i].face = 1;
card[y][++ip[y]] = card[x][i];//二维数组记录堆的状况
}
}
int main()
{
int cas = 1;
int n,m,i,j;
char str[105],done[105];
while(~scanf("%d",&n),n)
{
scanf("%s%s",str,done);
memset(ip,0,sizeof(ip));
for(i = 0;i<n;i++)
{
card[i+1][1].num = i+1;
if(str[i] == 'U')
card[i+1][1].face = 1;
else
card[i+1][1].face = 0;
ip[i+1] = 1;
}
int l = 1,r = n;
for(i = 0;i<n-1;i++)//翻转过程
{
if(done[i] == 'R')
{
turn(r,r-1);
r--;
}
else
{
turn(l,l+1);
l++;
}
}
scanf("%d",&m);
for(i = 1;i<=m;i++)
{
scanf("%d",&work[i]);
}
printf("Pile %d\n",cas++);
for(i = 1;i<=m;i++)
{
if(card[r][n-work[i]+1].face==1)//这里和r都是可以的,因为最后他们必然叠放在同一堆,l=r
printf("Card %d is a face up %d.\n",work[i],card[r][n-work[i]+1].num);
else
printf("Card %d is a face down %d.\n",work[i],card[r][n-work[i]+1].num);
}
}
return 0;
}