纸牌排序
Time Limit: 1000MS Memory Limit: 65536KB
Total Submissions: 149 Accepted: 66
Share
Description:
      给纸牌排序,不过一定不是一整副哦。而是一副中的部分纸牌,你只要按顺序输出你所读到的纸牌就行了。 
      纸牌的数字表示是 A、2、3、4、5、6、7、8、9、10、J、Q、K。 
      纸牌的花色表示是 黑桃:s,红桃:h,方块:d、梅花:c 。 
      没有大、小王。 
      结合表示,如: 
      黑桃A:As 
      红桃2:2h 
      方块3:3d 
      梅花4:4c 
      (一张牌的两个或三个的数字或字母之间没有空格隔开) 
      排序规则是: 
      先按数字排序:A、2、3、4、5… 
      如果数字相同按花色排序:s、h、d、c 。 
      比如:3s、Ah、2d、As、2c这5张牌 
      其排序结果是:As、Ah、2d、2c、3s。 
      
Input:
第一行包含一个整形数字N,接下来有N行,每一行包括一张纸牌(按上面介绍的表示法表示)。
Output:
输出N行,每一行包括一张纸牌(按上面介绍的表示法表示)。它们的顺序按介绍的排序方法排序。
Sample Input:
5
3s
Ah
2d
As
2c
Sample Output:
As
Ah
2d
2c
3s
Hint:
(小小提示:10s、10h、10d、10c有三个字符)
Source:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define N 100001

struct d{
	int   num;
	int   color;
	int   str;
}data[N];
int  n;
char str[N][4];

void _Bubble()
{
	int t1, t2,t3;
	for (int i = 1; i <= n;i++)
	for (int j = n; j > i; j--){
		if (data[j].num < data[j - 1].num){
			t1                 = data[j].num;
			t2                 = data[j].color;
			t3                 = data[j].str;
			data[j].num        = data[j - 1].num;
			data[j].color      = data[j - 1].color;
			data[j].str        = data[j - 1].str;
			data[j - 1].num    = t1;
			data[j - 1].color  = t2;
			data[j - 1].str    = t3;
		}
		else
		if (data[j].num == data[j - 1].num)
		if (data[j].color < data[j - 1].color){
			t1 = data[j].num;
			t2 = data[j].color;
			t3 = data[j].str;
			data[j].num = data[j - 1].num;
			data[j].color = data[j - 1].color;
			data[j].str = data[j - 1].str;
			data[j - 1].num = t1;
			data[j - 1].color = t2;
			data[j - 1].str = t3;
		}
	}
}

int main(void)
{
	std::cin >> n;
	for (int i = 1; i <= n; i++){
		std::cin>>str[i];
		data[i].str = i;
		if (strlen(str[i]) > 2)data[i].num = 10;
		else
			switch (str[i][0]){
			case 'J':
				data[i].num = 11;
				break;
			case 'Q':
				data[i].num = 12;
				break;
			case 'K':
				data[i].num = 13;
				break;
			case 'A':
				data[i].num = 1;
				break;
			default:
				data[i].num =(int) (str[i][0] - '1' + 1);
				break;
		    }
		switch (str[i][strlen(str[i])-1]){
		case 's':
			data[i].color = 1;
			break;
		case 'h':
			data[i].color = 2;
			break;
		case 'd':
			data[i].color = 3;
			break;
		case 'c':
			data[i].color = 4;
			break;
		}

	}

	_Bubble();

	for (int i = 1; i <= n; i++)
		printf("%s\n", str[data[i].str]);
	return 0;
}