ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 C Cheat

ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 

C Cheat

只要不理解错题意,按题意模拟就能A的题,然而写太烦了,最后其他人是否会猜4号的部分代码逻辑错了,结果从头看找不到BUG。

比赛结束才发现233333,=_=||。还有作为菜鸡是在不知道如何再精简一下代码,懒得用for循环去判断其他玩家是否会挑战当前玩家。

#include<bits/stdc++.h>
#define MS(a,b) memset(a,b,sizeof(a))
using namespace std;
map<string, int>w;
map<int, string>z;
char a[5];
struct player{
	int num[15];
}p[5];
int tnum[15];
int winner;
int og[20] = { 10,2,3,4,5,6,7,8,9,1,11,13,12 };
void Init() {
	MS(tnum, 0);
	w["A"] = 1; w["2"] = 2; w["3"] = 3; w["4"] = 4; w["5"] = 5;
	w["6"] = 6; w["7"] = 7; w["8"] = 8; w["9"] = 9; w["10"] = 10;
	w["J"] = 11; w["Q"] = 12; w["K"] = 13;
	z[1] = "A"; z[2] = "2"; z[3] = "3"; z[4] = "4"; z[5] = "5";
	z[6] = "6"; z[7] = "7"; z[8] = "8"; z[9] = "9"; z[10] = "10";
	z[11] = "J"; z[12] = "Q"; z[13] = "K";
}
//判断游戏是否结束
int check() {
	for (int i = 1; i <= 4; ++i) {
		int f = 1;
		for (int j = 1; j <= 13; ++j) {
			if (p[i].num[j] != 0) {
				f = 0;
				break;
			}
		}
		if (f) {
			winner = i;
			return 0;
		}
	}
	return 1;
}
//判断t玩家是否手牌为空
int ispemp(int t) {
	int f = 1;
	for (int i = 1; i <= 13; ++i) {
		if (p[t].num[i] != 0) {
			f = 0;
			break;
		}
	}
	return f;
}
//t玩家拿走桌上所有的牌
void ptake(int t) {
	for (int i = 1; i <= 13; ++i) {
		p[t].num[i] += tnum[i];
		tnum[i] = 0;
	}
}
void judge(int t, int turn) {
	int tnext = turn;
	tnext = tnext == 13 ? 1 : tnext + 1;
	switch (t) {
		case 1:
			if (p[t].num[turn] > 0) {
				//1没撒谎
				tnum[turn]++;
				p[t].num[turn]--;
				//2可能会质疑
				if (p[2].num[tnext] == 0) {
					ptake(2);
					return;
				}
				//3不会质疑
				//4可能会质疑
				if (ispemp(t)) {
					ptake(4);
				}
			}
			else {
				//1撒谎
				for (int i = 0; i < 13; ++i) {
					if (p[t].num[og[i]] > 0) {
						tnum[og[i]]++;
						p[t].num[og[i]]--;
						break;
					}
				}
				//2可能会质疑
				if (p[2].num[tnext] == 0) {
					ptake(1);
					return;
				}
				//3可能会质疑
				if (p[3].num[turn] == 4) {
					ptake(1);
					return;
				}
				//4可能会质疑
				if (ispemp(t)) {
					ptake(1);
				}
			}
			break;
		case 2:
			if (p[t].num[turn] > 0) {
				//2没撒谎
				tnum[turn] += p[t].num[turn];
				p[t].num[turn] = 0;
				//3不会质疑
				//4可能会质疑
				if (ispemp(t)) {
					ptake(4);
				}
				//1不会质疑
			}
			else {
				//2撒谎
				for (int i = 0; i < 13; ++i) {
					if (p[t].num[og[i]] > 0) {
						tnum[og[i]]++;
						p[t].num[og[i]]--;
						break;
					}
				}
				//3可能会质疑
				if (p[3].num[turn] == 4) {
					ptake(2);
					return;
				}
				//4可能会质疑
				if (ispemp(t)) {
					ptake(2);
					return;
				}
				//1可能会质疑
				if (p[1].num[turn] == 4) {
					ptake(2);
				}
			}
			break;
		case 3:
			if (p[t].num[turn] > 0) {
				//3没撒谎
				tnum[turn] += p[t].num[turn];
				p[t].num[turn] = 0;
				//4可能会质疑
				if (ispemp(t)) {
					ptake(4);
				}
				//1不会质疑
				//2不会质疑
			}
			else {
				//3撒谎
				int mina = 10, id;
				for (int i = 1; i <= 13; ++i) {
					if (p[t].num[i] != 0) {
						mina = min(mina, p[t].num[i]);
					}
				}
				for (int i = 0; i < 13; ++i) {
					if (p[t].num[og[i]] == mina) {
						id = og[i];
						break;
					}
				}
				int drop = p[t].num[id];
				tnum[id] += p[t].num[id];
				p[t].num[id] = 0;
				//4可能会质疑
				if (ispemp(t)) {
					ptake(3);
					return;
				}
				//1可能会质疑
				if (p[1].num[turn] + drop > 4) {
					ptake(3);
				}
				//2不会质疑
			}
			break;
		case 4:
			if (p[t].num[turn] >= 3) {
				//4没撒谎
				tnum[turn] += p[4].num[turn];
				p[t].num[turn] = 0;
				//1可能会质疑
				if (p[1].num[tnext] == 0) {
					ptake(1);
				}
				//2不会质疑
				//3不会质疑
			}
			else {
				int f = 0, drop = p[t].num[turn];
				tnum[turn] += drop;
				p[t].num[turn] = 0;
				for (int i = 0; i < 13; ++i) {
					if (p[t].num[og[i]] > 0) {
						f = 1;
						p[t].num[og[i]]--;
						tnum[og[i]]++;
						break;
					}
				}
				if (!f) {
					//4没撒谎
					//1可能会质疑
					if (p[1].num[tnext] == 0) {
						ptake(1);
					}
					//2不会质疑
					//3不会质疑
				}
				else {
					//4撒谎
					//1可能会质疑
					if (p[1].num[tnext] == 0 || p[1].num[turn] + f + drop > 4) {
						ptake(4);
						return;
					}
					//2不会质疑
					//3可能会质疑
					if (p[3].num[turn] == 4) {
						ptake(4);
					}
				}
			}
			break;
		default:
			return;
			break;
	}
}
int main() {
	Init();
	while (scanf("%s", a) != EOF) {
		MS(tnum, 0);
		for (int i = 1; i <= 4; ++i) {
			MS(p[i].num, 0);
		}
		p[1].num[w[a]]++;
		for (int i = 1; i <= 4; ++i) {
			int n = i == 1 ? 12 : 13;
			for (int j = 0; j < n; ++j) {
				scanf("%s", a);
				p[i].num[w[a]]++;
			}
		}
		int turn = 1, t = 1;
		while (check()) {
			judge(t, turn);
			t = t == 4 ? 1 : t + 1;
			turn = turn == 13 ? 1 : turn + 1;
		}
		for (int i = 1; i <= 4; ++i) {
			if (i == winner) {
				printf("WINNER\n");
			}
			else {
				int f = 1;
				for (int j = 1; j <= 13; ++j) {
					for (int k = 1; k <= p[i].num[j]; ++k) {
						if (f) {
							cout << z[j];
							f = 0;
						}
						else {
							cout << " " << z[j];
						}
					}
				}
				printf("\n");
			}
		}
	}
	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/Yolaren/p/9691336.html