[P1148 拱猪计分]
FallingFYC_
·
2023-03-22 19:31:28
·
题解
原题
看题解区里的各位大佬的题解都好~长啊,于是便有了这篇题解。
分析
我的题目总结如下:
每个玩家都会有一些记分牌,每个人的初始得分均为 0,按如下规则进行计分:
以 S 代表黑桃、H 代表红心、D 代表方块、C 代表梅花,并用 1 ~ 13 分别代表 1 ~ K (以上内容不重要)
只有 S12、所有 H 牌(13 张)、D11、D10(这两张都是!!!)和 C10 将作为输入牌。
若一玩家只有 C10,则其 + 50 分,否则将其余牌分数和 * 2。
S12 分值为 - 100,D11 分值为 + 100。
若所有 H 牌不在同一玩家手里且其有 H 牌,则依下表将其手里有的 H 牌从总分中减去相应的分:
牌
减去分数
H1
- 50
H2
- 2
H3
- 3
H4
- 4
H5
- 5
H6
- 6
H7
- 7
H8
- 8
H9
- 9
H10
- 10
H11
- 20
H12
- 30
H13
- 40
例如你只有 H1、H3 和 H4,那么你将减 -50 + -3 + -4 = -57 分。
若所有 H 牌在同一玩家手里,则有如下情况:
若所有 H 牌在同一玩家手里且其也仅有这 13 张牌,则 +200 分
若所有 H 牌在同一玩家手里且其也有 S12 和 D11,则 +500 分
C10 功能不变
现在来到我的思路 & 代码部分!
我是这么想的:
存储:由于输入时一次要输入4 组数据,且要判段其是否都为零,所以我们需要一个一维数组存储每个 n 的值,用一个二维数组存储这一组数据中每个人的牌,因为所有牌都由花色 & 号码 2 部分构成,所以用结构体比较合适。关于规则 5,用一个数组来存储即可。
输入:略
过程:重头戏来啦!
先算出通过 H 牌损失的分数,这样有两个好处:
1.算出通过 H 牌损失的分数
2.便于判断规则 6,具体来说,若通过 H 牌损失的分数为所有H牌损失的分数总和,那么就意味着满足规则 6 局面 1,总分 = 200。
再算出通过 S12 和 D11 所得到(损失)的分数,这样还有两个好处:
1.通过 S12 和 D11 所得到(损失)的分数
2.又是便于判断规则 6,具体来说,若算完后分数没有变化(S12 和 D11 互相抵消),且有这两张牌(即牌数 > 13)则满足规则 6 局面 2,总分 = 500。
最后算通过 C10 得到的分数
代码:
#include
using namespace std;
const int cH[14] = {0 , -50 , -2 , -3 , -4 , -5 , -6 , -7 , -8 , -9 , -10 , -20 , -30 , -40};//规则5的表
struct Poker
{
char col;
int num;
}pk[5][20];//存储牌
int n[5] , sc , ts;
string c;
int main()
{
while (true)
{
for (int i = 1 ; i <= 4 ; i++)
{
cin >> n[i];
for (int j = 1 ; j <= n[i] ; j++)
{
cin >> c;
pk[i][j].col = c[0];
pk[i][j].num = (c.length() == 3 ? (c[1] - '0') * 10 : 0) + (c[c.length() - 1] - '0');//压行(
}
}
if (!(n[1] || n[2] || n[3] || n[4])) break;\\判断是否结束
for (int i = 1 ; i <= 4 ; i++)
{
sc = 0;
for (int j = 1 ; j <= n[i] ; j++)
if (pk[i][j].col == 'H') sc += cH[pk[i][j].num];
if (sc == -194) sc = 200;
for (int j = 1 ; j <= n[i] ; j++)
{
if (pk[i][j].col == 'S')/*只有S12花色是S*/ sc -= 100;
if (pk[i][j].col == 'D')/*只有D10,D11花色是D*/ sc += 100;
}
if (sc == 200 && n[i] > 13) sc = 500;//至少15张牌才可以形成规则6的局面2
for (int j = 1 ; j <= n[i] ; j++)
if (pk[i][j].col == 'C') {sc *= 2; break;}
if (n[i] == 1 && pk[i][1].col == 'C') sc = 50;//特判只有一张C10
if (sc > 0) cout << '+';
cout << sc << " ";
}
cout << endl;
}
return 0;//愉快结束!!!
}
评测记录
合肥学院怎么样好不好?附就业前景及全国排名
取代單調 window.alert() 的好選擇