すっごく簡易化したもので考えてみたけど,
頭を取る→刻子を取る→順子を取る→残りをチェックということでいいのかな?
刻子と順子が逆になったほうがいい場合は,あるのか???
import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { // 簡略化のために牌は1-9のみ // 配列haiのindex番号と牌の枚数が対応している // 例) hai[1]<=>1の枚数 int[] hai = {0,0,2,2,2,2,2,2,2,0}; // 大車輪 // int[] hai = {0,3,1,1,1,1,1,1,1,4}; // 九連宝燈 // int[] hai = {0,3,3,3,3,0,0,0,0,2}; // 四暗刻 int[] c_hai; List<Integer> mentu; // 頭をまず取る for(int i = 1; i < hai.length; i++){ if(hai[i] >= 2){ c_hai = hai.clone(); c_hai[i] -= 2; mentu = new ArrayList<Integer>(); judge(c_hai, mentu, i); } } } // 再帰 static void judge(int[] hai, List<Integer> mentu, int atama){ if(mentu.size() == 12){ print(mentu, atama); } // 刻子を取る for(int i = 1; i < hai.length; i++){ if(hai[i] >= 3){ mentu.add(i); mentu.add(i); mentu.add(i); hai[i] -= 3; judge(hai, mentu, atama); } } // 順子を取る for(int i = 1; i < (hai.length-2); i++){ if(hai[i] > 0 && hai[i+1] > 0 && hai[i+2] > 0){ mentu.add(i); mentu.add(i+1); mentu.add(i+2); hai[i]--; hai[i+1]--; hai[i+2]--; judge(hai, mentu, atama); } } } // 表示 static void print(List<Integer> mentu, int atama){ for(int i = 0; i < mentu.size(); i++){ System.out.print(mentu.get(i) + " "); if(i % 3 == 2) System.out.print("| "); } System.out.println(atama + " " + atama); } }
上記の実行結果は下記のようになる
------------------------------------------------------
3 4 5 | 3 4 5 | 6 7 8 | 6 7 8 | 2 2
2 3 4 | 2 3 4 | 6 7 8 | 6 7 8 | 5 5
2 3 4 | 2 3 4 | 5 6 7 | 5 6 7 | 8 8
------------------------------------------------------