Flipper

来源:互联网 发布:淘宝卖水果 编辑:程序博客网 时间:2024/06/06 18:38
题意:给定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;}

原创粉丝点击