■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 件のコメント:
コメントを投稿