AOJ0043 Puzzle
問題リンク Puzzle
- 解法
全探索します。各数字が何個残っているかを配列で管理します。
最初、2個ペアとする数字を決めます。残った12個の数字で3ペアが4つ作れるかを全探索します。
- ソース
import java.util.Scanner; //Puzzle public class AOJ0043 { static boolean enable(int[] c){ for(int i=1;i<=9;i++){ if(c[i]>=2){ c[i]-=2; if(solve(c, 1))return true; c[i]+=2; } } return false; } static boolean solve(int[] c, int k){ if(k==10)return true; if(c[k]==0)return solve(c, k+1); if(c[k]>=3){ c[k]-=3; if(solve(c, k))return true; c[k]+=3; } if(k>=8)return false; boolean f = true; for(int i=k;i<k+3;i++){ if(c[i]==0)f = false; } if(!f)return false; for(int i=k;i<k+3;i++){ c[i]--; } if(solve(c, k))return true; for(int i=k;i<k+3;i++){ c[i]++; } return false; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()){ char[] s = sc.next().toCharArray(); int[] count = new int[10]; for(char ch : s)count[ch-'0']++; String r = "0"; for(int i=1;i<=9;i++){ int[] c = new int[10]; for(int j=1;j<=9;j++)c[j]=count[j]; c[i]++; if(c[i]==5){ c[i]--; continue; } if(enable(c)){ if(r.equals("0"))r = i+""; else r += " "+i; } c[i]--; } System.out.println(r); } } }