这题太***了
有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; } } }