Index: score_memo.txt ================================================================== --- score_memo.txt +++ score_memo.txt @@ -19,8 +19,8 @@ beard1 853? beard2 4487? // 崩すの怖がりすぎて間に合わなくなって溺死 beard3 809 // 無理ゲー:速攻で髭刈らないといけない beard4 1997 // 髭を解放しないように動くゲー beard5 665 // これクリアできるの -horock1 427 +horock1 732? horock2 235 horock3 1542 Index: src/solver.d ================================================================== --- src/solver.d +++ src/solver.d @@ -221,10 +221,18 @@ if(is_rocky(g.map[y+1,x])||is_rocky(g.map[y+1,x-1])||is_rocky(g.map[y+1,x+1]) ||is_rocky(g.map[y,x+1])||is_rocky(g.map[y,x-1])) tgt ~= new Pos(y,x); cand ~= search(g, ro, tgt, death, true); } + + // 'horo-push' mode + if(cand.empty) { + Pos[] horo = g.map.objects('@'); + if(!horo.empty) { + cand ~= search(g, ro, horo, death, true); + } + } if(cand.empty) { choke_count++; cand ~= tuple('W',int.max); } @@ -296,17 +304,18 @@ foreach(p; gs) if(!danger(p.y,p.x)) q ~= p; bool[][] v = new bool[][](g.map.H+2, g.map.W+2); foreach(p; q) v[p.y][p.x]=true; + bool first_step = true; for(int step=1; q.length; ++step) { Pos[] q2; foreach(p; q) { int[] yyy=[p.y-1,p.y,p.y,p.y+1]; int[] xxx=[p.x,p.x-1,p.x+1,p.x]; string sss="URLD"; - for(int i=0; i=4)continue; if(y!=p.y)continue; @@ -409,10 +422,11 @@ q2 ~= new Pos(y,x); v[y][x]=true; } } } + first_step = false; q = q2; } return []; } return (danger_ok ? [] : tryA()) ~ tryB() ~ tryC();