从扑克牌中抽出5张无序纸牌,判断纸牌是否为顺子。1代表A,11代表J,12代表Q,13代表K,0代表大小王并可以视为任意纸牌。是则输出YES,否则输出NO。
#include <iostream> #include <algorithm> using namespace std; bool judge(int *a,int n) { n++; while (n < 5) { if (a[n - 1] == a[n]) return false; n++; } return true; } int main() { int a[5], joker = 0; for (int i = 0; i < 5; i++) cin >> a[i]; sort(a, a + 5); for (int i = 0; i < 5; i++) { if (a[i] == 0) joker++; else { if (judge(a, i) && (a[4] - a[i]) - (4 - i) <= joker) cout << "YES"; else cout << "NO"; break; } } return 0; }
思路:首先判断是否存在重复卡牌,有则不会是顺子
然后看 卡牌区间宽度 是否和 牌数量的宽度 相符合。joker的存在可以容许牌数量宽度的扩展。
这个方法不用考虑是否处于边界,因为可以向另一个方向补位
具体分析:
0 0 1 4 5
卡牌区间宽度为5-1=4,牌数量宽度为4-2=2。此时的两个joker可以使牌数量宽度与卡牌区间宽度匹配。
0 1 3 4 5
卡牌区间宽度为5-1=4,牌数量宽度为4-1=3。刚好又有一个joker。
1 2 3 4 5
卡牌区间宽度为5-1=4,牌数量宽度为4-0=4。此时就是顺子了。
0 0 1 2 3
卡牌区间宽度为3-1=2,牌数量宽度为4-2=2。这也是顺子,joker向4 5的方向补位。
0 0 1 5 6
卡牌区间宽度为6-1=5,牌数量宽度为4-2=2。需要三个joker来补,但是只有两个,所以不是顺子。