# Sorting# String Manipulation# Arrays

e582 - 00555 - Bridge Hands

🔗 前往 ZeroJudge 原題

題目描述

題目要求模擬發牌過程,將一副撲克牌分給四位玩家(南、西、北、東),並按照花色和點數對每位玩家的手牌進行排序後輸出。發牌人方位由輸入指定。

解題思路

程式首先讀取發牌人的方位。然後,讀取一副撲克牌的順序,將每張牌的花色和點數轉換為一個數值,以便進行排序。接著,按照發牌人的方位,將牌分發給四位玩家。最後,對每位玩家的手牌按照花色和點數進行排序,並輸出結果。排序的標準是先按花色排序(C < D < S < H),再按點數排序(2 < 3 < ... < T < J < Q < K < A)。

複雜度分析

  • 時間複雜度: O(n log n),其中 n 是牌的數量 (52)。主要時間花在排序上。
  • 空間複雜度: O(n),主要用於儲存牌的資訊。

程式碼

#include <iostream>
using namespace std;
struct p{
	string x;
	int k;
};
p ans[4][13];
char aaa[4]={'S','W','N','E'};
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	char a,a1,a0;
	while(cin >> a){
		if(a=='#')break;
		for(int i=0;i<4;++i)
			for(int j=0;j<13;++j){
				ans[i][j].x="";
				ans[i][j].k=0;
			}
		for(int j=0;j<13;++j){
			for(int i=0;i<4;++i){
				cin >> a1 >> a0;
				ans[i][j].x=a1;ans[i][j].x+=a0;
				if(a1=='D')
					ans[i][j].k=100;
				else if(a1=='S')
					ans[i][j].k=200;
				else if(a1=='H')
					ans[i][j].k=300;
				if(a0<='9')
					ans[i][j].k+=(a0-48)*4; 
				else if(a0=='T')
					ans[i][j].k+=40;
				else if(a0=='J')
					ans[i][j].k+=44;
				else if(a0=='Q')
					ans[i][j].k+=48;
				else if(a0=='K')
					ans[i][j].k+=52;
				else
					ans[i][j].k+=56;
			}
		}
		for(int i=0;i<4;++i)
			for(int j=0;j<13;++j)
				for(int kk=j+1;kk<13;++kk)
					if(ans[i][j].k>ans[i][kk].k)
						swap(ans[i][j],ans[i][kk]);
		int st=2;
		if(a=='N')
			st=1;
		else if(a=='E')
			st=0;
		else if(a=='S')
			st=3;
		for(int i=0;i<4;++i){
			if(i)cout << "\n";
			cout << aaa[i] << ":";
			for(int j=0,itt=(st+i)%4;j<13;++j)
				cout << " " << ans[itt][j].x;
		}
		cout << "\n";
	}
}

Discussion