个人做法,数据结构可以优化为链表
查看原帖
个人做法,数据结构可以优化为链表
1190291
buzhimingtongxue楼主2024/6/1 23:14
#include <algorithm>
#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;

// 将每组输入的数据升序排列 
void cinHelper(map<int, vector<int>> &cardsF_P, int n);

// 打牌recursion 
void gameWinner(map<int, vector<int>> &cardsF1P1, map<int, vector<int>> &cardsF2P2);
// recursion辅助函数 
void WinnerHelper(map<int, vector<int>> &cardsFP1, map<int, vector<int>> &cardsFP2, int color, int point);

// debug输入排序用的 
//ostream &operator <<(ostream& out, map<int, vector<int>> &v) {
//	for (pair<int, vector<int>> i : v) {
//		out << i.first << ": ";
//		for (int j : i.second) {
//			out << j << " ";
//		}
//		out << endl;
//	}
//	return out;
//}

int main() {
	int T;
	cin >> T;			// 测试数据的组数 
	string result[T];	// 存储所有测试数据的结果 
	for (int i = 0; i < T; i++) {
		int n, fNums, pNums, s;	// 依次是手牌数,花色数,点数,第一轮谁先出牌 
		cin >> n >> fNums >> pNums >> s;
		map<int, vector<int>> cardsF1_P1;	// 扶苏 
		map<int, vector<int>> cardsF2_P2;	// 小F 
		cinHelper(cardsF1_P1, n);
		cinHelper(cardsF2_P2, n);
		if (s == 1) {	// 扶苏先出牌 
			gameWinner(cardsF1_P1, cardsF2_P2);
		}
		else {	// 小F先出牌 
			gameWinner(cardsF2_P2, cardsF1_P1);
		}
		result[i] = (cardsF1_P1.empty() == true ? "FS wins!" : "FR wins!");	// 每组数据打完牌后的结果 
	} 
	for (string s : result) {	// 依次输出每组的结果 
		cout << s << endl;
	}
	return 0;
}

void cinHelper(map<int, vector<int>> &cardsF_P, int n) {
	vector<int> enterNum1(n);
	int enterNum2;
	for (int i = 0; i < n; i++) {	// 花色 
		cin >> enterNum1[i];
	}
	for (int i = 0; i < n; i++) {	// 点数 
		cin >> enterNum2;
		cardsF_P[enterNum2].push_back(enterNum1[i]);
	}
	for (auto it = cardsF_P.begin(); it != cardsF_P.end(); it++) {
		sort(it->second.begin(), it->second.end());
	}
}

void gameWinner(map<int, vector<int>> &cardsF1P1, map<int, vector<int>> &cardsF2P2) {
	WinnerHelper(cardsF1P1, cardsF2P2, 0, 0);
}

void WinnerHelper(map<int, vector<int>> &cardsFP1, map<int, vector<int>> &cardsFP2, int color, int point) {
	if (color == 0 && point == 0) {
		auto it = cardsFP1.begin();
		color = it->second[0];
		point = it->first;
		if (cardsFP1[point].size() <= 1) {
			cardsFP1.erase(it);
		}
		else {
			cardsFP1[point].erase(it->second.begin());
		}
		
		if (cardsFP1.empty()) {
			return;
		}
		else {
			WinnerHelper(cardsFP2, cardsFP1, color, point);
		}
	}
	else {
		for (auto it = cardsFP1.begin(); it != cardsFP1.end(); it++) {
			if (it->first > point) {
				for (auto i = it->second.begin(); i != it->second.end(); i++) {
					if (*i == color) {
						point = it->first;
						if (cardsFP1[point].size() <= 1) {
							cardsFP1.erase(it);
						}
						else {
							cardsFP1[point].erase(i);
						}
						
						if (cardsFP1.empty()) {
							return;
						}
						else{
							WinnerHelper(cardsFP2, cardsFP1, color, point);
							return;
						}
					}			
				}	
			}
		}
		WinnerHelper(cardsFP2, cardsFP1, 0, 0); 
	}
}
2024/6/1 23:14
加载中...