日期:2025年10月17日
ZeroJudge 題目連結:f647. 撲克牌
解題想法
我用串列儲存牌組,先用 for 迴圈産生按照花色、數字排列好的 52 張牌,接下來依照指令用串列切片修改內容。
Python 程式碼
使用時間約為 0.4 s,記憶體約為 3.4 MB,通過測試。
deck = [""]*52
suits = ('S', 'H', 'D', 'F')
akqj = {1: 'A', 13: 'K', 12: 'Q', 11: 'J'}
for i in range(4):
for j in range(1, 14):
if 2 <= j <= 10: deck[i*13 +j-1] = suits[i] + str(j)
else: deck[i*13 + j-1] = suits[i] + akqj[j]
n = int(input())
for _ in range(n):
line = input().split()
if line[0] == '1':
a, b = int(line[1])-1, int(line[2])-1
deck = deck[a:b+1] + deck[:a] + deck[b+1:]
elif line[0] == '2':
a, b = int(line[1])-1, int(line[2])-1
deck = deck[:a] + deck[b+1:] + deck[a:b+1]
elif line[0] == '3':
k = int(line[1])
deck = deck[52-k:] + deck[:52-k]
else:
k = int(line[1])
deck = deck[k:] + deck[:k]
print(*deck[:5])
C++ 程式碼
使用時間約為 0.3 s,記憶體約為 380 kB,通過測試。
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
vector<string> deck (52);
string suits[4] = {"S", "H", "D", "F"};
map<int, string> akqj = {{1, "A"}, {13, "K"}, {12, "Q"}, {11, "J"}};
for(int i=0; i<4; i++) {
for(int j=1; j<=13; j++) {
if (j >= 2 && j <= 10) deck[i*13 +j-1] = suits[i] + to_string(j);
else deck[i*13 + j-1] = suits[i] + akqj[j];
}
}
int n; cin >> n;
for(int i=0; i<n; i++) {
string cmd; cin >> cmd;
if (cmd == "1") {
int a, b; cin >> a >> b;
a--; b--;
vector<string> tmp (deck.begin()+a, deck.begin()+b+1);
tmp.insert(tmp.end(), deck.begin(), deck.begin()+a);
tmp.insert(tmp.end(), deck.begin()+b+1, deck.end());
deck = tmp;
} else if (cmd == "2") {
int a, b; cin >> a >> b;
a--; b--;
vector<string> tmp (deck.begin(), deck.begin()+a);
tmp.insert(tmp.end(), deck.begin()+b+1, deck.end());
tmp.insert(tmp.end(), deck.begin()+a, deck.begin()+b+1);
deck = tmp;
} else if (cmd == "3") {
int k; cin >> k;
vector<string> tmp (deck.end()-k, deck.end());
tmp.insert(tmp.end(), deck.begin(), deck.end()-k);
deck = tmp;
} else {
int k; cin >> k;
vector<string> tmp (deck.begin()+k, deck.end());
tmp.insert(tmp.end(), deck.begin(), deck.begin()+k);
deck = tmp;
}
}
for(int i=0; i<5; i++) cout << deck[i] << " \n"[i == 4];
return 0;
}
沒有留言:
張貼留言