HDU4431

来源:互联网 发布:源码天空 编辑:程序博客网 时间:2024/05/18 07:12

Problem : Mahjong
Source : 2012 Asia Tianjin Regional Contest
Description :

打麻将胡牌,现在给你十三张牌,问你能胡哪几张牌。

Solution :

模拟,可惜,当时做的时候用了dfs,然后就一直超时。这题其实很简单。我们首先要做的就是把牌组合一下,相同的放一起,然后一种一种判断。我们现在关注常规的判断(两张一样的牌,其余的要么是三张一样的,要么是三张连一起的)。我们枚举这34张牌,然后一张一张加进去。形成14张牌后,我们一定要枚举2张听牌。这很重要。然后如果出现三张一样的,那么就形成对子,如果这种牌还剩一张,那么不用说,肯定是要和后面的2中牌形成顺子。依次这样判断,最后就可以得出所有的答案了,具体看代码吧。很清楚。

Code(JAVA) :

import java.util.Scanner;public class Main {    Scanner cin = new Scanner(System.in);    final static int M = 35;    final static String[] mahjong = new String[] { "", "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", };    int[] c = new int[M];    int getNum(String str) {        for (int i = 0; i < mahjong.length; i++)            if (mahjong[i].equals(str))                return i;        return -1;    }    boolean d_1() {        int tmp = 0;        for (int i = 0; i < M; i++)            tmp += (c[i] == 2 ? 1 : 0);        return tmp == 7;    }    boolean d_2() {        int[] array = new int[] { 1, 9, 10, 18, 19, 27, 28, 29, 30, 31, 32, 33,                34 };        int tmp1 = 0, tmp2 = 0;        for (int i = 0; i < array.length; i++)            if (c[array[i]] == 1)                ++tmp1;            else if (c[array[i]] == 2)                ++tmp2;        return tmp1 == 12 && tmp2 == 1;    }    boolean d_3() {        for (int i = 1; i <= 34; i++)            if (c[i] >= 2) {                c[i] -= 2;                if (d_4()) {                    c[i] += 2;                    return true;                }                c[i] += 2;            }        return false;    }    boolean d_4() {        int[] tmp = new int[M];        for (int i = 0; i < c.length; i++)            tmp[i] = c[i];        for (int i = 1; i <= 34; i++) {            if (tmp[i] >= 3)                tmp[i] -= 3;            if (tmp[i] > 0 && (i >= 28 || (i - 1) % 9 >= 7))                return false;            else if (tmp[i] > 0 && (tmp[i] > tmp[i + 1] || tmp[i] > tmp[i + 2]))                return false;            else if (tmp[i] > 0) {                tmp[i + 1] -= tmp[i];                tmp[i + 2] -= tmp[i];                tmp[i] -= tmp[i];            }        }        return true;    }    public Main() {        int T = cin.nextInt();        while (T-- > 0) {            int[] que = new int[M];            int top = 0;            String tmp = "";            for (int i = 0; i < c.length; i++)                c[i] = 0;            for (int i = 0; i < 13; i++) {                tmp = cin.next();                ++c[getNum(tmp)];            }            for (int i = 1; i < M; i++) {                ++c[i];                if (c[i] > 4) {                    --c[i];                    continue;                }                if (d_1() || d_2() || d_3())                    que[top++] = i;                --c[i];            }            if (top == 0)                System.out.println("Nooten");            else {                System.out.print(top);                for (int i = 0; i < top; i++)                    System.out.print(" " + mahjong[que[i]]);                System.out.println();            }        }    }    public static void main(String[] args) {        new Main();    }}
0 0