题目描述
斗地主起源于湖北十堰房县,据说是一位叫吴修全的年轻人根据当地流行的扑克玩法“跑得快”改编的,如今已风靡整个中国,并流行于互联网上。
牌型: 单顺,又称顺子,最少5张牌,最多12张牌(3…A)不能有2,也不能有大小王,不计花色。
例如: 3-4-5-6-7-8,7-8-9-10-J-Q,3-4-5-6-7-8-9-10-J-Q-K-A
可用的牌 3<4<5<6<7<8<9<10<J<Q<K<A<2<B(小王)<C(大王),每种牌除大小王外有四种花色 (共有13×4+2张牌)
输入
输入的第一行为当前手中的牌
输入的第二行为已经出过的牌(包括对手出的和自己出的牌)
输出
最长的顺子
对手可能构成的最长的顺子(如果有相同长度的顺子,输出牌面最大的那一个),
如果无法构成顺子,则输出 NO-CHAIN。
样例输入
3-3-3-4-4-5-5-6-7-8-9-10-J-Q-K-A-A-A-A
4-5-6-7-8-8-8
样例输出
9-10-J-Q-K
思路:
题目要求我们求出对方的最长顺子长度,那么我们就要先得到对方的牌信息,以此来推测对方的最长顺子长度。题目的输入带有我们自己所有的牌,以及目前已经出去的牌,我们由总拍数就能够得到对方的牌数,以此来推测对方的最长顺子长度。
因为顺子不涉及2和大小王,因此,我们不需要考虑这两种牌对我们影响,只需要考虑剩下牌如何产生顺子,剩下的牌就是3---A这几种牌,总共12种,所以可以定义一个数组长度为12,每个元素代表一种牌的个数是否为0,为零就赋值为0,否则赋值为1代表有这个牌,因此,最后我们就是求一个长度为12的数组的最长连续的1元素的长度,用0(n)的时间复杂度就可以完成要求。
代码:
package Date3Point21;
import java.util.*;
public class MainD {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String s1 = scanner.nextLine();
String s2 = scanner.nextLine();
s1=s1+"-"+s2;
String[] split = s1.split("-");
int[] nums=new int[12];
Arrays.fill(nums,4);
Map<String ,Integer> sToInt=new HashMap<>();
sToInt.put("J",11);
sToInt.put("Q",12);
sToInt.put("K",13);
sToInt.put("A",1);
Map<Integer ,String> IntToS=new HashMap<>();
IntToS.put(11,"J");
IntToS.put(12,"Q");
IntToS.put(13,"K");
IntToS.put(1,"A");
for(int i=0;i<split.length;i++){
int num=0;
if(sToInt.containsKey(split[i])){
num=sToInt.get(split[i]);
}else if(!Objects.equals(split[i], "2")){
num= Integer.parseInt(split[i]);
}else{
continue;
}
if(num==1){
nums[nums.length-1]--;
}else{
nums[num-3]--;
}
}
String maxStr="";
int maxLen=0;
String str="";
int len=0;
for(int i=0;i<nums.length;i++){
if(nums[i]==0 || i==nums.length-1){
if(nums[i]!=0){
len++;
str+="A";
}
if(len>=5 && len>maxLen){
maxLen=len;
maxStr=str;
}else if(len==maxLen && len!=0){
if (maxStr.charAt(0)<str.charAt(0)) {
maxStr=str;
}
}
len=0;
str="";
}else{
len++;
String s="";
if(i==nums.length-1){
s="A";
}else if(IntToS.containsKey(i+3)){
s=IntToS.get(i+3);
}else{
s=String.valueOf(i+3);
}
if(str.length()==0){
str+=s;
}else{
str+="-"+s;
}
}
}
if(maxLen==0 || maxStr.length()<5){
System.out.println("NO-CHAIN");
}else{
System.out.println(maxStr);
}
}
}