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; }