[P1148 拱猪计分]

[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() 的好選擇