f647 - 撲克牌
題目描述
題目描述了撲克牌洗牌的過程,共有四種洗牌方式,要求在經過一系列洗牌操作後,輸出牌組最上面五張牌的牌面。
解題思路
本題的核心在於模擬撲克牌的洗牌過程。由於牌組大小固定為 52 張,可以使用陣列 a 來表示牌組。題目中給出了四種洗牌方式,分別對應不同的操作:
cmd=1 a b: 將第a張到第b張牌移動到牌組的最上方。cmd=2 a b: 將第a張到第b張牌移動到牌組的最下方。cmd=3 k: 將牌組最底下的k張牌移動到牌組的最上方。cmd=4 k: 將牌組最上方的k張牌移動到牌組的最下方。
程式碼中,對於每種洗牌方式,都使用迴圈和陣列操作來模擬洗牌過程。例如,對於 cmd=1,程式碼會將 a 到 b 的牌取出,然後將它們插入到牌組的最上方,並將其餘的牌向後移動。
複雜度分析
- 時間複雜度: O(N * M),其中 N 是輸入的洗牌操作次數,M 是每次操作涉及的牌的數量(最壞情況下為 52)。
- 空間複雜度: O(52),主要用於儲存牌組的陣列
a。
程式碼
#include <iostream>
using namespace std;
string a[53]={
"XX",
"SA","S2","S3","S4","S5","S6","S7","S8","S9","S10","SJ","SQ","SK",
"HA","H2","H3","H4","H5","H6","H7","H8","H9","H10","HJ","HQ","HK",
"DA","D2","D3","D4","D5","D6","D7","D8","D9","D10","DJ","DQ","DK",
"FA","F2","F3","F4","F5","F6","F7","F8","F9","F10","FJ","FQ","FK"
};
int main(){
cin.tie(0); ios::sync_with_stdio(false);
int n,is,x,y;
cin >> n;
while(n--){
cin >> is ;
if(is==1){
cin >> x >> y;
if(x==1)continue;
int up=y-x+1,it=0;
string b[up];
for(int i=y;i>=x;--i){
b[it++]=a[i];
if(x-it>0)a[i]=a[x-it];
if(i==x){
while(x-it>0){
a[i]=a[x-it];
++it;
--i;
}
}
}
it=0;
for(int i=up;i>0;--i)
a[i]=b[it++];
}
else if(is==2){
cin >> x >> y;
if(y==52)continue;
int up=y-x+1,it=0;
string b[up];
for(int i=x;i<=y;++i){
b[it++]=a[i];
if(i+up<=52){
a[i]=a[i+up];
}
if(i==y){
while(i+up<=52){
a[i]=a[i+up];
++i;
}
}
}
it=0;
for(int i=52-up+1;i<=52;++i){
a[i]=b[it++];
}
}
else if(is==3){
cin >> x;
if(x==52)continue;
x=52-x+1;
y=52;
int up=y-x+1,it=0;
string b[up];
for(int i=y;i>=x;--i){
b[it++]=a[i];
if(x-it>0)a[i]=a[x-it];
if(i==x){
while(x-it>0){
a[i]=a[x-it];
++it;
--i;
}
}
}
it=0;
for(int i=up;i>0;--i)
a[i]=b[it++];
}
else{
cin >> y;
if(y==52)continue;
x=1;
int up=y-x+1,it=0;
string b[up];
for(int i=x;i<=y;++i){
b[it++]=a[i];
if(i+up<=52){
a[i]=a[i+up];
}
if(i==y){
while(i+up<=52){
a[i]=a[i+up];
++i;
}
}
}
it=0;
for(int i=52-up+1;i<=52;++i){
a[i]=b[it++];
}
}
}
for(int i=1;i<=5;++i)
cout << a[i] << " ";
}