POJ 1786

题意

  • 四个人围成一圈打牌,有一个人发牌,从他的下一个人开始顺时针一人一张,每人能得到13张牌。
  • 给定牌的大小顺序:
    1. 花色:C(梅花)<D(方片)<S(黑桃)<H(红桃)
    2. 面值:2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A。
  • 要求由小到大排序手中的牌,并按格式输出

输入样例(多组数据,#结束输入)

N
CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9
SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3
#

输出样例

South player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
| C | C | D | D | S | S | S | S | H | H | H | H | H |
|6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
West player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A|
| C | C | C | C | D | D | D | S | S | S | S | H | H |
|2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
North player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3|
| C | C | C | D | D | D | D | D | S | S | S | H | H |
|3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
East player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K|
| C | C | C | C | D | D | D | S | S | H | H | H | H |
|7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K|
+---+---+---+---+---+---+---+---+---+---+---+---+---+

思路

  • 顺时针发牌:map转化发牌人方向为数组,使用模运算
  • 牌的大小:利用map类型,转化为数字比较
  • 对每个人sort排序,输出

总结

该题编译器版本较老,不支持c11,map初始化列表无法通过,if语句超时,改为在main中向map手动添加元素,顺利ac。

代码

#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;


map<char,int> dealPlayers;
map<char,int> colorOrder;
map<char,int> numberOrder;

struct poker {
	char color;
	char number;

	poker() {}
	poker(char c,char n):color(c),number(n) {}
};
bool cmp(const poker &a,const poker &b) {
	if(a.color!=b.color)
		return colorOrder[a.color]<colorOrder[b.color];
	if(isalpha(a.number)&&isalpha(b.number)) 
		return numberOrder[a.number]<numberOrder[b.number];
	return a.number<b.number;
}



int main(void) {
	dealPlayers['S']=0,dealPlayers['W']=1,dealPlayers['N']=2,dealPlayers['E']=3;
	colorOrder['C']=0,colorOrder['D']=1,colorOrder['S']=2,colorOrder['H']=3;
	numberOrder['T']=0,numberOrder['J']=1,numberOrder['Q']=2,numberOrder['K']=3,numberOrder['A']=4;
	
	char dealCard;
	while(1) {
		cin>>dealCard;
		if(dealCard=='#')
			break;
		int dealPlayer=dealPlayers[dealCard];
		vector<poker> players_pokers[4];
		char color,number;
		for(int i=1; i<=52; ++i) {
			cin>>color>>number;
			players_pokers[(i+dealPlayer)%4].push_back(poker(color,number));
		}

		for(int i=0; i<4; ++i) {
			sort(players_pokers[i].begin(),players_pokers[i].end(),cmp);
			if(i==0)
				printf("South player:\n");
			else if(i==1)
				printf("West player:\n");
			else if(i==2)
				printf("North player:\n");
			else if(i==3)
				printf("East player:\n");
			printf("+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");
			for(vector<poker>::iterator iter=players_pokers[i].begin(); iter!=players_pokers[i].end(); ++iter)
				printf("|%c %c",iter->number,iter->number);
			printf("|\n");
			for(vector<poker>::iterator iter=players_pokers[i].begin(); iter!=players_pokers[i].end(); ++iter)
				printf("| %c ",iter->color);
			printf("|\n");
			for(vector<poker>::iterator iter=players_pokers[i].begin(); iter!=players_pokers[i].end(); ++iter)
				printf("|%c %c",iter->number,iter->number);
			printf("|\n");
			printf("+---+---+---+---+---+---+---+---+---+---+---+---+---+\n");
		}
		printf("\n");
	}


	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值