■0179 Mysterious Worm
深さ優先探索.同じ状態が何度も発生しないように,既に出た状態を集合に突っ込んでおくと良い(ただし,計算量がO(logn)であるものを用いないとTLEの可能性有).
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; String worm; void run(){ for(;;){ worm=sc.next(); if(worm.equals("0")){ break; } solve(); } } void solve(){ LinkedList<String> que=new LinkedList<String>(); TreeSet<String> set=new TreeSet<String>(); HashMap<String, Integer> map=new HashMap<String, Integer>(); que.add(worm); set.add(worm); map.put(worm, 0); for(; !que.isEmpty();){ String s=que.poll(); boolean f=true; for(int i=0; i<s.length(); i++){ f&=s.charAt(0)==s.charAt(i); } if(f){ println(""+map.get(s)); return; } for(String t : next(s)){ if(!set.contains(t)){ que.offer(t); set.add(t); map.put(t, map.get(s)+1); } } } println("NA"); } LinkedList<String> next(String s){ LinkedList<String> list=new LinkedList<String>(); for(int i=0; i<s.length()-1; i++){ if(s.charAt(i)!=s.charAt(i+1)){ char c='*'; switch(s.charAt(i)+s.charAt(i+1)){ case 'r'+'g': c='b'; break; case 'g'+'b': c='r'; break; case 'b'+'r': c='g'; break; } list.add(s.substring(0, i)+c+c +(i<s.length()-2?s.substring(i+2, s.length()):"")); } } return list; } 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 件のコメント:
コメントを投稿