hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。
胡牌有以下几种情况:
1、一个对子 + 4组 3个相同的牌或者顺子。
2、7个不同的对子。
3、13幺
贪心的思想:
对于某张牌>=3个,先减去3个相同,再组合顺子。

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;



public class Main {

        public static void main(String[] args) throws IOException{
                StreamTokenizer cin = new StreamTokenizer(new BufferedInputStream(System.in)); 
                InputReader in = new InputReader(System.in)  ;
                PrintWriter out = new PrintWriter(System.out) ;

                int t = in.nextInt() ;
                while(t-- > 0){
                         new Task().solve(in, out)  ;   //out.flush() ;
                }

               out.flush() ;

        }

}

class Task{

          static  ArrayList<String>  majiang = new ArrayList<String>(Arrays.asList(
                                                      "1m" , "2m" , "3m" , "4m" ,  "5m" , "6m" ,  "7m" , "8m" , "9m" ,     
                                                      "1s" , "2s" , "3s" , "4s" ,  "5s" , "6s" ,  "7s" , "8s" , "9s" ,     
                                                      "1p" , "2p" , "3p" , "4p" ,  "5p" , "6p" ,  "7p" , "8p" , "9p" ,     
                                                      "1c" , "2c" , "3c" , "4c" , "5c" , "6c" , "7c" )
          );

          static  int[] num = new int[34] ;

          static ArrayList<Integer> ad = new ArrayList<Integer>(Arrays.asList(0,8,9,17,18,26)) ;     

          boolean  helper(){
                           if(yes1()) return true ;
                           if(yes2()) return true ;


                           for(int i = 0 ; i < 34 ; i++){
                                     if(num[i] >= 2){
                                            num[i] -= 2 ;
                                             if(yes3()){
                                                   num[i] += 2 ;
                                                    return  true ;
                                             }
                                              num[i] += 2 ;
                                     }
                           }

                           return false ;
          }

          boolean  yes1(){
                           int g = 0 ; 
                           for(int i = 0 ; i < 34 ; i++){
                                   if(num[i] == 2)  g++ ;
                           }
                           return  g == 7 ;
          }

          boolean  yes2(){
                            int x = 0  , y  =  0 ; 

                            for(int i : ad){
                                 if(num[i] == 1) x++ ;
                                 else if(num[i] == 2) y++ ;
                            }

                            for(int i = 27 ; i < 34 ; i++){
                                if(num[i] == 1) x++ ;
                                else if(num[i] == 2) y++ ;
                            }
                            return  x == 12 && y == 1 ;
          }

          boolean  yes3(){
                           int[] a = new int[34]  ;
                           //System.arraycopy(num, 0 , a, 0, 34) ;
                           for(int i = 0 ; i < 34 ; i++) a[i] = num[i]  ;

                           int  sum = 0 ;

                           for(int i = 0 ; i <= 18 ; i += 9){
                                  for(int j = 0 ; j < 9 ; j++){
                                         int k = i + j ;
                                         if(a[k] >= 3){
                                               a[k] -= 3 ;
                                               sum++ ;
                                         }
                                         while((j <= 6) && (a[k] > 0) && (a[k+1] > 0) && (a[k+2] > 0)){
                                                 a[k]-- ;
                                                 a[k+1]-- ;
                                                 a[k+2]--  ;
                                                 sum++  ;
                                         }
                                  }
                           }

                           for(int i = 27 ; i < 34 ; i++){
                                   if(a[i] >= 3){
                                            a[i] -= 3 ;
                                            sum++ ;
                                   }
                           }

                           return sum == 4  ;
          }

          public void solve(InputReader  in , PrintWriter out) throws IOException{
                       ArrayList<String> ans = new ArrayList<String>() ;

                       Arrays.fill(num, 0) ;
                       for(int i = 0 ; i <= 12 ; i++) num[majiang.indexOf(in.next())]++ ;

                       for(int i = 0 ; i < 34 ; i++){
                               num[i]++ ; 
                               if(num[i] <= 4 && helper())   ans.add(majiang.get(i)) ;
                               num[i]-- ;  
                       }

                       if(ans.size() == 0)  out.println("Nooten")  ;
                       else{
                              out.print(ans.size()) ;
                              for(String e : ans)  out.print(" " + e)  ;
                              out.println() ;
                       }


          }

}



class InputReader{
    public BufferedReader reader;
    public StringTokenizer tokenizer;

    public InputReader(InputStream stream){
           reader = new BufferedReader(new InputStreamReader(stream), 32768);
           tokenizer = null;
    }

    public String next(){
        while(tokenizer == null || !tokenizer.hasMoreTokens()){
            try{
                tokenizer = new StringTokenizer(reader.readLine());
            }catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return tokenizer.nextToken();
    }

    public int nextInt() {
        return Integer.parseInt(next());
    }

    public long nextLong() {
        return Long.parseLong(next());
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值