这题太***了
有13张牌
然后从1到9 添加没有 出现四次的
变成14张的完全手牌
然后判断 该手牌能否hu
能hu 就讲该数字添加到res中
calculate 用来寻找14张牌能否胡
isFindQue 递归寻找 在找到雀头的情况下,剩下的牌能够hu
传递数组列表时应该注意是否接下来的操作会改变数组, 如果改变 最好申请新的空间
import java.util.Scanner;
import java.util.*;
public class Main{
public static void main(String[] args) {
int [] input = new int[14];
int [] num = new int[10];
Scanner sc = new Scanner(System.in);
for(int i=0 ;i<13; i++){
int in = sc.nextInt();
num[in]++;
input[i] = in;
}
//初始化完毕
ArrayList<Integer> res =new ArrayList<>();
for(int i=1;i<10;i++){
if(num[i]!=4) {
input[13] = i;
if(calculate(input)) res.add(i);
}
}
//开始打印结果
if(res.isEmpty()) System.out.println(0);
else{
String out = "";
for( int dig:res){
out = out + String.valueOf(dig) + ' ';
}
System.out.println(out.substring(0,out.length()-1));
}
}
public static boolean calculate(int[] inputs){
//寻找雀头
// 要重新定义 in 否则排序会把原有的顺序打乱, 比如添加2 2在原有数组中跑到前面去了 后面添加 input[13]就会出错;
int[] in = new int[inputs.length];
for (int i=0;i<in.length;i++){
in[i] = inputs[i];
}
Arrays.sort(in);
ArrayList<Integer> input = new ArrayList<Integer>();
for(int num:in){
input.add(num);
}
int i=1; //1-13寻找雀头
while(i<14){
//寻找到一组雀头
if(in[i] == in[i-1]){
int temp = input.get(i-1);
input.remove(i-1);
input.remove(i-1);
if(isFindQue(input)) return true;
input.add(i-1,temp);
input.add(i-1,temp);
}
i++;
}
return false;
}
public static boolean isFindQue(ArrayList<Integer> in){
if(in.size()<3) return true;
//是否有三个一样的
if(in.get(0) == in.get(1) && in.get(1) == in.get(2)){
ArrayList<Integer> temp = new ArrayList<Integer>(in);
temp.remove(0);temp.remove(0);temp.remove(0);
return isFindQue(temp);
}
else {
//是否有三个连起来的
// a,b,c分别记录下标 连续三个不同值的下标
int i= 1,a =0;
while(in.get(i)==in.get(a)) i++;
int b =i;
while(i<in.size()-1 && in.get(i)==in.get(b)) i++;
int c =i;
if(in.get(c)-in.get(b) == 1 && in.get(b)-in.get(a)==1){
ArrayList<Integer> temp = new ArrayList<Integer>(in);
temp.remove(a);temp.remove(b-1);temp.remove(c-2);
return isFindQue(temp);
}
// 没有三个一样的 也没有三个连起来的 就不能和
else return false;
}
}
}



京公网安备 11010502036488号