プログラムのデザイン思考のC - スイスの神のトランプ(マルチキーワードソート)

タイトル

神HRZためにスイスの流行が、彼は非常に強力であった彼は水、水A +を取得できるようにするために、彼は退屈していたように、すべてのクラスが、ある、自宅で退屈、および3他の人々だ:カッコウ東、テンを神とのカードをプレイするzjm(スイス世界は今、いくつかの時間を神に苦しんで)。
明らかに、取締役会は4人、サークルで構成されています。私たちは、北、東西四方向を求めます。英語を対応する北、東、南、西です。52あるゲームの合計は、ポーカーで構成されています。初めは、私たちは(英語イニシャルのロゴと、トラックに)ディーラーを任命時計回りの順番をライセンス、ライセンス始め、ディーラーは自分の最初を送ったが、彼の次を行っていません人(時計回りに隣の人)。このように、誰もが13枚のカードを取得します。
今、我々は、(梅)<(正方形シート)<(スペード)<(心臓)、(入力、我々は、それぞれプラム、正方形片C、D、S、Hを使用する最初の色は、カードの順序を定義しますスペード、ハート、すなわち)単語の最初の文字という。符号の顔の値に対して、我々は、2 <3 <4 <5 <必要 6 <7 <8 <9 <T <J <Q <K <A。
今、あなたは、神のように、あなたは小さなからのカードの大きな手に皆を並べ替え、およびフォローする出力形式を設定する必要があります。(特定の出力フォーマット記述と出力例を参照)。

入力
入力は複数のデータセットが含まれ
、各データセットの最初の行のディーラーへのイエスを表し、大文字の文字が含まれています。文字は「#」であれば、入力の終わりを示します。
次の2行、行あたり52文字、ショー26枚のカードは、2行は52枚のカードの合計と一致し。各カードは、2つの文字からなり、最初の文字は色を表し、2番目の文字は値を示しています。

出力の
出力結果をライセンスデータの複数のセット、データの各セット(すなわち、ブランク期間を使用するデータ線のグループ間、テキストの終わりはまた、空行のために必要である)空白行の後に追加の出力を必要とします。
データの各セットは、常に五行、第一及び第五のライン出力固定続いサウスプレーヤーの出力、選手名出力線(トラック)に、すなわち各選手に、時計回り方向の出力線24を構成しますフォーマット(例を参照)、出力値の順序と形式で2行目と4行目(例を参照)、3行出力カラーシーケンスの形式(例を参照)。

サンプル入力
N
CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9の
SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3の

サンプル出力
韓国選手:
± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - +
| 6 6 | AA | 6 6 | JJ | 5 | 6 6 | 7 7 | 9 9 | 4 4 | 5 | 7 7 | 9 9 | TT |
| C | C | D | D | S | S | S | S | H | H | H | H | H |
| 6 6 | AA | 6 6 | JJ | 5 | 6 6 | 7 7 | 9 9 | 4 4 | 5 | 7 7 | 9 9 | TT |
± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - +
西プレイヤー:
± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - +
| 2 2 | 5 | 9 9 | KK | 5 | 7 7 | 9 9 | 4 4 | TT | JJ | AA | 8 8 | AA |
| C | C | C | C | D | D | D | S | S | S | S | H | H |
| 2 2 | 5 | 9 9 | KK | 5 | 7 7 | 9 9 | 4 4 | TT | JJ | AA | 8 8 | AA |
± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - +
ノースプレイヤー:
± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - +
| 3 3 | 4 4 | JJ | 2 2 | 3 3 | TT | QQ | KK | 8 8 | QQ | KK | 2 2 | 3 3 |
| C | C | C | D | D | D | D | D | S | S | S | H | H |
| 3 3 | 4 4 | JJ | 2 2 | 3 3 | TT | QQ | KK | 8 8 | QQ | KK | 2 2 | 3 3 |
± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - +
東プレイヤー:
± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - +
| 7 7 | 8 8 | TT | QQ | 4 4 | 8 8 | AA | 2 2 | 3 3 | 6 6 | JJ | QQ | KK |
| C | C | C | C | D | D | D | S | S | H | H | H | H |
| 7 7 | 8 8 | TT | QQ | 4 4 | 8 8 | AA | 2 2 | 3 3 | 6 6 | JJ | QQ | KK |
± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - ± - - +

思考

この問題は、マルチキーワードソートすることができます。
主キー(色):C <D <S < H
キーワード(公称値):2 <3 <4 < 5 <6 <7 <8 <9 <T <J <Q <K <
STLの使用ソート機能、適切な比較関数の調製:
①色が異なる場合に、比較のみが色の値を返します。
②額面返された値を比較すると、同じ色、。

コード

#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <utility>
#include <algorithm>
#include <stdlib.h>
#include <string.h>

using namespace std;

// pair<char, char> p; 第一个是花色,第二个数字

int iconValue(const char c)
{
	switch (c)
	{
	case 'C':
		return 0;
	case 'D':
		return 1;
	case 'S':
		return 2;
	default:	// 'H'
		return 3;
	}
}

int numValue(const char c)
{
	if (c >= '2' && c <= '9') return c - '0';
	switch (c)
	{
	case 'T':
		return 10;
	case 'J':
		return 11;
	case 'Q':
		return 12;
	case 'K':
		return 13;
	default:	// 'A'
		return 14;
	}
}

// 先比较花色,再比较数字
bool cmp(const pair<char, char>& p1, const pair<char, char>& p2)
{
	if (p1.first != p2.first) return iconValue(p1.first) < iconValue(p2.first);
	else return numValue(p1.second) < numValue(p2.second);
}

void printCards(vector<pair<char, char>> v)
{
	cout << "+---+---+---+---+---+---+---+---+---+---+---+---+---+" << endl;
	cout << "|";
	for (vector<pair<char, char>>::iterator it = v.begin(); it != v.end(); it++) {
		cout << (*it).second << " " << (*it).second << "|";
	}
	cout << endl;
	cout << "|";
	for (vector<pair<char, char>>::iterator it = v.begin(); it != v.end(); it++) {
		cout << " " << (*it).first << " " << "|";
	}
	cout << endl;
	cout << "|";
	for (vector<pair<char, char>>::iterator it = v.begin(); it != v.end(); it++) {
		cout << (*it).second << " " << (*it).second << "|";
	}
	cout << endl;
	cout << "+---+---+---+---+---+---+---+---+---+---+---+---+---+" << endl;
}

void print(vector<int> v)
{
	vector<int>::iterator i1 = v.begin();
	vector<int>::iterator i2 = v.begin(); i2++;
	while (i2 != v.end()) {
		cout << *i1 << " ";
		i1++; i2++;
	}
	cout << *i1 << endl;
}

int main()
{
	char pos;
	cin >> pos;

	while (pos != '#') {

		string order;

		if (pos == 'N') order = "4123";
		else if (pos == 'E') order = "1234";
		else if (pos == 'S') order = "2341";
		else order = "3412";

		string print_order[] = { "South player:","West player:","North player:" ,"East player:" };

		vector<pair<char, char>> v[4];

		for (int i = 0; i < 13; i++) {
			for (int j = 0; j < 4; j++) {
				char icon, num;
				cin >> icon >> num;
				pair<char, char> p(icon, num);
				v[j].push_back(p);
			}
		}

		for (int i = 0; i < 4; i++) {
			sort(v[i].begin(), v[i].end(), cmp);
		}

		cout << "South player:" << endl;
		int index = order.find(1 + '0');
		printCards(v[index]);

		cout << "West player:" << endl;
		index = order.find(2 + '0');
		printCards(v[index]);

		cout << "North player:" << endl;
		index = order.find(3 + '0');
		printCards(v[index]);

		cout << "East player:" << endl;
		index = order.find(4 + '0');
		printCards(v[index]);

		cout << endl;

		cin >> pos;
	}
}

終わり

リリース5元の記事 ウォンの賞賛0 ビュー47

おすすめ

転載: blog.csdn.net/weixin_43826681/article/details/104690382