正经题解
2025-08-22 13:19:06
发布于:浙江
9阅读
0回复
0点赞
入门者也能学会的代码~
思路
1.初始化
在日常生活中,想要处理这种问题,可以使用表格标记,在拥有的那一格上标记1,比如,你有一张CA牌,就可以做出下面的表格:
点数/花色 | D | C | H | S |
---|---|---|---|---|
A | 0 | 1 | 0 | 0 |
2 | 0 | 0 | 0 | 0 |
…… | 0 | 0 | 0 | 0 |
看到上面的表格,你自然而然会想到二维数组,于是写下了这行代码:
int n, record[4][13] = {}, cnt = 0;
n
是牌数,cnt
后面再说作用。
2.获取牌数
cin >> n;
3.记录出现的牌
每一行输入是两个字符,我们把他们记作flower
(花色)和num
(点数),这两个变量分别代表“表1”中的行与列。但用数组表示必须把它们转换成合适的下标。在字符中,字符‘1’的ASCII码为49,则转换成下标应该将ASCII码减去49,我们将新的点数下标记作num_t
:
char num, flower;
int num_t, flower_t;
cin >> flower >> num;
num_t = num - 49;
可是输入点数还可能是ATJQK五个字符中的一个字符,所以要对这些字符对应的下标进行特殊处理:
switch(num)
{
case 'A':num_t = 0;break;
case 'T':num_t = 9;break;
case 'J':num_t = 10;break;
case 'Q':num_t = 11;break;
case 'K':num_t = 12;break;
}
之所以将num_t
的取值设为0~12而不是1~13是因为数组下标从0开始。
上面的代码还将花色对应的下标记作flower_t
。同样的,因为花色都是大写字母,所以对下标作特殊处理(注意下标从0开始):
switch(flower)
{
case 'D':flower_t = 0;break;
case 'C':flower_t = 1;break;
case 'H':flower_t = 2;break;
case 'S':flower_t = 3;break;
}
再将数组中该下标对应的值设为1:
record[flower_t][num_t] = 1;
4.记录未出现的牌
在数组中,未出现的牌被标记为0,也就是说,遍历这个数组,如果当前值为0说明这张牌未出现。我们可以使用初始化时声明的cnt
来记录未出现牌的数量:
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 13; j++)
{
if(record[i][j] == 0)
cnt++;
}
}
5.输出结果
直接输出cnt
的值:
cout << cnt;
完整代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, record[4][13] = {}, cnt = 0;
cin >> n;
for(int i = 0; i < n; i++)
{
char num, flower;
int num_t, flower_t;
cin >> flower >> num;
num_t = num - 49;
switch(num)
{
case 'A':num_t = 0;break;
case 'T':num_t = 9;break;
case 'J':num_t = 10;break;
case 'Q':num_t = 11;break;
case 'K':num_t = 12;break;
}
switch(flower)
{
case 'D':flower_t = 0;break;
case 'C':flower_t = 1;break;
case 'H':flower_t = 2;break;
case 'S':flower_t = 3;break;
}
record[flower_t][num_t] = 1;
}
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 13; j++)
{
if(record[i][j] == 0)
cnt++;
}
}
cout << cnt;
return 0;
}
别以为在运算符前后加空格的就是AI,变量名都是自己写的,我要是AI干脆直接用set得了。
本文纯手写,并非使用大模型生成!
全部评论 2
2025-08-22 来自 浙江
0啊啊啊!!!
2025-08-22 来自 浙江
0
有帮助,赞一个