题目链接
题目大意
emmm,说实话,英语水平有限,一开始布吉岛他说了啥,自己试了好几次结果都不一样
其实就是,把最左边或者最右边的牌先反转,再叠加到旁边的牌上,然后移动的时候,符合栈的特点
思路
① 如果用栈的话,我jio得可以用四个栈,一边两个来回换,倒来倒去实现
② 不用栈的话,就直接数组模拟了,开一个二维数组,只不过!!!!每次开二维数组都会把行列弄混,我就说怎么结果不正确,debug之后再知道又把行跟列记错了,5555
代码
#include <iostream>
using namespace std;
typedef struct card
{
int num;
char d;
} myCard;
myCard stk[105][105];
int main()
{
int n;
int height[105]; //记录高度
int f=1;
while(cin>>n && n!=0)
{
for(int i=1; i<=n; i++) //把牌铺开
{
stk[1][i].num = i;
char ch;
cin>>ch;
stk[1][i].d = ch;
height[i]=1;
}
getchar();
char c;
int head=1,tail=n;
int h;
for(int i=0; i<n-1; i++) //开始模拟翻转操作了
{
cin>>c;
if(c=='R') //右边
{
h = height[tail];
for(int i=h; i>0; i--)
{
if(stk[i][tail].d=='U')
stk[i][tail].d = 'D';
else
stk[i][tail].d = 'U';
stk[++height[tail-1]][tail-1] = stk[i][tail];
}
height[tail] = 0;
tail--;
}
else //左边
{
h = height[head];
for(int i=h; i>0; i--)
{
if(stk[i][head].d=='U')
stk[i][head].d = 'D';
else
stk[i][head].d = 'U';
stk[++height[head+1]][head+1] = stk[i][head];
}
height[head] = 0;
head++;
}
}
int m;
int a[105];
cin>>m;
for(int j=1;j<=m;j++)
cin>>a[j];
cout<<"Pile "<<f<<endl;
f++;
for(int j=1;j<=m;j++)
{
int hh = height[tail] - a[j] +1;
if(stk[hh][tail].d == 'U')
printf("Card %d is a face up %d.\n",a[j],stk[hh][tail].num);
else
printf("Card %d is a face down %d.\n",a[j],stk[hh][tail].num);
}
}
return 0;
}
总结
① 这题很简单了,主要是模拟的时候,二维数组一定一定要看清楚第一个是行,第二个是列,写反了再改炒鸡麻烦
② 一开始偷懒不想用height[]数组记录高度,只用数字的话,提交时wa,应该是情况很复杂的时候会出错,所以以后考虑解题思路的时候,要提前把很复杂的情况考虑进去,找一个通解
③ 为了便于描述,都从1开始
//之前看过的一个电影叫《Flipped》,译名叫怦然心动,一开始看到还很激动,但是这俩好像半毛钱关系都没有哈哈哈,偷偷放个剧照叭