# Array Manipulation# Simulation# Greedy

f647 - 撲克牌

🔗 前往 ZeroJudge 原題

題目描述

題目描述了撲克牌洗牌的過程,共有四種洗牌方式,要求在經過一系列洗牌操作後,輸出牌組最上面五張牌的牌面。

解題思路

本題的核心在於模擬撲克牌的洗牌過程。由於牌組大小固定為 52 張,可以使用陣列 a 來表示牌組。題目中給出了四種洗牌方式,分別對應不同的操作:

  1. cmd=1 a b: 將第 a 張到第 b 張牌移動到牌組的最上方。
  2. cmd=2 a b: 將第 a 張到第 b 張牌移動到牌組的最下方。
  3. cmd=3 k: 將牌組最底下的 k 張牌移動到牌組的最上方。
  4. cmd=4 k: 將牌組最上方的 k 張牌移動到牌組的最下方。

程式碼中,對於每種洗牌方式,都使用迴圈和陣列操作來模擬洗牌過程。例如,對於 cmd=1,程式碼會將 ab 的牌取出,然後將它們插入到牌組的最上方,並將其餘的牌向後移動。

複雜度分析

  • 時間複雜度: 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] << " ";
}

Discussion