■0043 Puzzle
a[k]=数字kが出てきた回数とする.
a[k]++;とすると,これはkを付け加えた場合に相当する.
あとは,aが条件をみたすかを簡単な探索で解く.
import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class Main{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; void run(){ for(; sc.hasNext();){ String s=sc.next(); int[] a=new int[10]; for(int i=0; i<s.length(); i++){ a[s.charAt(i)-'0']++; } solve(a); } } void solve(int[] a){ LinkedList<Integer> list=new LinkedList<Integer>(); for(int i=1; i<=9; i++){ a[i]++; if(satisfy(a.clone())){ list.add(i); } a[i]--; } for(int i=0; i<list.size(); i++){ print(list.get(i)+(i==list.size()-1?"\n":" ")); } if(list.size()==0){ println("0"); } } boolean satisfy(int[] a){ if(!check(a)){ return false; } for(int i=1; i<=9; i++){ a[i]-=2; if(rec(a, 0)){ return true; } a[i]+=2; } return false; } boolean rec(int[] a, int n){ if(!check(a)){ return false; } if(n==4){ return true; } for(int i=1; i<=9; i++){ a[i]-=3; if(rec(a, n+1)){ return true; } a[i]+=3; } for(int i=1; i<=7; i++){ a[i]--; a[i+1]--; a[i+2]--; if(rec(a, n+1)){ return true; } a[i]++; a[i+1]++; a[i+2]++; } return false; } boolean check(int[] a){ for(int e : a){ if(e<0||e>4){ return false; } } return true; } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } void print(String s){ System.out.print(s); } void println(String s){ System.out.println(s); } public static void main(String[] args){ // System.setOut(new PrintStream(new BufferedOutputStream(System.out))); new Main().run(); } }
0 件のコメント:
コメントを投稿