結果
問題 | No.832 麻雀修行中 |
ユーザー |
![]() |
提出日時 | 2019-05-24 22:57:05 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 133 ms / 2,000 ms |
コード長 | 2,553 bytes |
コンパイル時間 | 2,129 ms |
コンパイル使用メモリ | 79,296 KB |
実行使用メモリ | 41,608 KB |
最終ジャッジ日時 | 2024-09-17 11:49:51 |
合計ジャッジ時間 | 6,700 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 6 |
other | AC * 25 |
ソースコード
import java.util.Scanner;import java.util.TreeSet;public class Main {public static void main(String[] args) throws Exception {Scanner sc = new Scanner(System.in);String s = sc.next();sc.close();int[] cnt = new int[9];for (int i = 0; i < s.length(); i++) {cnt[s.charAt(i) - '1']++;}TreeSet<Integer> ans = new TreeSet<Integer>();// 七対子int one = 0;int two = 0;int idx = 0;for (int i = 0; i < cnt.length; i++) {if (cnt[i] == 1) {one++;idx = i;} else if (cnt[i] == 2) {two++;}}if (one == 1 && two == 6) {ans.add(idx);}int[] work = new int[9];for (int i = 0; i < 9; i++) {// 単騎System.arraycopy(cnt, 0, work, 0, cnt.length);if (work[i] > 0) {work[i]--;if (threes(work) && cnt[i] < 4) {ans.add(i);}}// シャンポンSystem.arraycopy(cnt, 0, work, 0, cnt.length);if (work[i] > 1) {for (int j = i + 1; j < 9; j++) {System.arraycopy(cnt, 0, work, 0, cnt.length);if (work[j] > 1) {work[i] -= 2;work[j] -= 2;if (threes(work)) {if (cnt[i] < 4) ans.add(i);if (cnt[j] < 4) ans.add(j);}}}}// カンチャンSystem.arraycopy(cnt, 0, work, 0, cnt.length);if (i < 7 && work[i] > 0 && work[i + 2] > 0) {for (int j = 0; j < 9; j++) {System.arraycopy(cnt, 0, work, 0, cnt.length);work[i]--;work[i + 2]--;if (work[j] > 1) {work[j] -= 2;if (threes(work) && cnt[i + 1] < 4) {ans.add(i + 1);}}}}// 両面、ペンチャンSystem.arraycopy(cnt, 0, work, 0, cnt.length);if (i < 8 && work[i] > 0 && work[i + 1] > 0) {for (int j = 0; j < 9; j++) {System.arraycopy(cnt, 0, work, 0, cnt.length);work[i]--;work[i + 1]--;if (work[j] > 1) {work[j] -= 2;if (threes(work)) {if (i > 0 && cnt[i - 1] < 4) ans.add(i - 1);if (i < 7 && cnt[i + 2] < 4) ans.add(i + 2);}}}}}for (int i : ans) {System.out.println(i + 1);}}static boolean threes(int[] work) {boolean flg = true;for (int i = 0; i < 9; i++) {if (work[i] >= 3) {work[i] -= 3;}while (work[i] > 0) {work[i]--;if (i < 8 && work[i + 1] > 0) {work[i + 1]--;} else {flg = false;break;}if (i < 7 && work[i + 2] > 0) {work[i + 2]--;} else {flg = false;break;}}if (!flg) {break;}}return flg;}}