有五张Poker牌,需要进行判断:它是否是一个正常的顺子。 说明:34567890JQKA2wW相信大家知道,为简化操作,0代表10,w和W代表小王和大王。大、小王可代替任意的牌哟。编程判断输入的五张牌是否会构成一个顺子(方案多个时,输出较大的,34567和0JQKA分别是最小和最大的顺子)
输入格式:
输入用五个字符代表的五张牌,系统确保输入的数据无误,但并不一定是有序排列。
输出格式:
输出这五张牌组成的顺子或输出−1表示不是顺子,注意大小王可当任意的牌使用,输出的顺子要求是最大的一个,且升序排列(如果有的话)。输出格式中开始和结尾是一对方括号,具体格式见样例。
输入样例1:
A0KJw
输出样例1:
[0JQKA]
输入样例2
A3452
输出样例2:
[-1]
思路:
既然要组顺子,那我们反向思考一下在什么情况下不能组成顺子?
1、除大小王之外的排重复出现。
2、顺子最大的牌和最小的牌差值大于4。
3、出现2。
(因为最大只到A)剩下的就都是顺子!
AC代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define endl "\n" string s,sz="34567890JQKA"; bool vis[17]; map<char,ll>mp; void solve(){ cin >> s; bool f=0; ll mx=0,mn=20; for(ll i = 0 ; i < s.size() ; i ++){ if(s[i] == 'W' || s[i] == 'w')continue; mp[s[i]]++; if(mp[s[i]] > 1 || s[i] == '2')f=1; ll x=sz.find(s[i]); if(x >= 0){ vis[x]=1; mx=max(mx,x); mn=min(mn,x); } } if(f || mx-mn > 4){ cout << "[-1]" << endl; return; } mn=min(mn,7ll); cout << "[" << sz.substr(mn,5) << "]" << endl; return; } int main(){ ll t=1;//cin >> t; while(t --)solve(); return 0; }