C++从若干副扑克牌中随机抽5张牌,判断是不是一个顺子,即这五张牌是不是连续的。2—10为数字本身,A为1,J为11,Q为12,K为13,大、小王为0,可以看成任意数字。A不能视为14。定义一个is straight()
时间: 2023-10-30 12:08:08 浏览: 176
可以采用如下算法实现is_straight()函数:
1. 将5张牌从小到大排序,0(即大小王)放在最后。
2. 统计0的个数。
3. 遍历排序后的数组,统计相邻数字之间的空缺总数。
4. 如果空缺总数小于等于0的个数,则这5张牌是顺子,否则不是。
下面是实现is_straight()函数的C++代码:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool is_straight(vector<int>& nums) {
sort(nums.begin(), nums.end()); // 排序
int zero_count = count(nums.begin(), nums.end(), 0); // 统计0的个数
int gap_count = 0; // 统计空缺总数
for (int i = zero_count; i < nums.size() - 1; i++) {
if (nums[i + 1] == nums[i]) { // 存在对子,不可能是顺子
return false;
}
gap_count += nums[i + 1] - nums[i] - 1;
}
return gap_count <= zero_count; // 空缺总数小于等于0的个数
}
int main() {
vector<int> nums{1, 2, 3, 4, 5}; // 测试用例:顺子
cout << is_straight(nums) << endl;
nums = {0, 0, 1, 2, 5}; // 测试用例:顺子(含大小王)
cout << is_straight(nums) << endl;
nums = {0, 0, 1, 3, 5}; // 测试用例:非顺子(含大小王)
cout << is_straight(nums) << endl;
nums = {0, 0, 1, 1, 5}; // 测试用例:非顺子(含对子)
cout << is_straight(nums) << endl;
return 0;
}
```
输出结果为:
```
1
1
0
0
```
阅读全文