C++扑克
一个扑克,他玩的游戏使用1幅扑克牌(不使用大鬼和小鬼),共52张牌。他今天运气不好,一直在输,他怀疑扑克牌被动了手脚:如果他能发现2张牌花色和大小都一样,那么就能确定牌有问题。
输入:第一行是正整数n代表已经打出几张牌,以下n行依次为这些牌的花色和大小。
输出:如果发现了问题,就输出I am angry,否则输出Nice hand。
输入样例:
5
diamond 8
spade A
diamond 10
heart Q
diamond 8
输出样例:
I am angry
这个程序应该怎么写?
参考如下,还望采纳:
具体实现:
1、读入牌的数量 n,和每张牌的花色和大小;
2、定义一个map存储已经打出的牌,键为 "花色+大小",值为牌数;
3、对于每一张牌,如果在map中找到了对应的键,那么对应的牌数加1;如果牌数>=2,则直接输出 "I am angry",退出程序;
4、如果扫完所有的牌都没有出现问题,则输出 "Nice hand"。
代码如下:
#include <iostream>
#include <unordered_map>
using namespace std;
const int N = 55;
int n;
unordered_map<string, int> h;
int main() {
cin >> n;
while (n--) {
string a, b;
cin >> a >> b;
string t = a + b;
h[t]++;
if (h[t] == 2) {
cout << "I am angry" << endl;
return 0;
}
}
cout << "Nice hand" << endl;
return 0;
}
#include <iostream>
#include <string>
#include <map>
using namespace std;
const map<string, int> suit = {{"Spade", 1}, {"Heart", 2}, {"Club", 3}, {"Diamond", 4}};
const map<string, int> rank = {{"2", 2}, {"3", 3}, {"4", 4}, {"5", 5}, {"6", 6}, {"7", 7}, {"8", 8}, {"9", 9},
{"10", 10}, {"J", 11}, {"Q", 12}, {"K", 13}, {"A", 14}};
int main() {
int n;
cin >> n;
bool flag = false;
map<pair<int, int>, int> m;
while (n--) {
string s1, s2;
cin >> s1 >> s2;
int r = rank.at(s2), c = suit.at(s1);
if (++m[{r, c}] == 2) {
flag = true;
break;
}
}
if (flag) cout << "I am angry" << endl;
else cout << "Nice hand" << endl;
return 0;
}
代码中使用了 STL 中的 map,将花色和点数映射到整数,并利用 pair 记录已出的牌的状态,如果有重复的牌就说明问题出现了。