Index: src/game.d ================================================================== --- src/game.d +++ src/game.d @@ -218,19 +218,22 @@ void opIndexAssign(char c, in Pos p) { this[p.y, p.x] = c; } - Pos[] lambdas() const { + Pos[] objects(char c) const { Pos[] ans; for(int y=1; y<=H; ++y) for(int x=1; x<=W; ++x) - if(this[y,x] == '\\') + if(this[y,x] == c) ans ~= new Pos(y,x); return ans; } + Pos[] razors() const { return objects('!'); } + Pos[] lambdas() const { return objects('\\'); } + bool cleared() const { for(int y=1; y<=H; ++y) for(int x=1; x<=W; ++x) if(this[y,x] == 'L' || this[y,x] == 'O') Index: src/solver.d ================================================================== --- src/solver.d +++ src/solver.d @@ -49,18 +49,19 @@ char act(const(Game) g, string death, int breath) { const Pos ro = g.map.robot; const Pos[] la = g.map.lambdas(); + const Pos[] ra = g.map.razors(); const Pos li = g.map.lift; Tuple!(char,int)[] cand; char c = 'W'; if( la.empty ) { cand = search(g, ro, [li], death); } else { - cand ~= search(g, ro, la, death); + cand ~= search(g, ro, la~ra, death); } // 'dig' mode if(cand.empty) { const(Pos)[] tgt; @@ -162,11 +163,11 @@ if(y==s.y && x==s.x && i<4) { char c = "UDRL"[i]; if( death.count(c) == 0 ) return [tuple(c,step)]; } else if(forbidden_cell[y][x]){ - } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.'||i>=4) { + } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.'||g.map[y,x]=='!'||i>=4) { if(danger(y,x)) continue; q2 ~= new Pos(y,x); v[y][x]=true; } @@ -202,11 +203,11 @@ if(y==s.y && x==s.x && i<4) { char c = "UDRL"[i]; if( death.count(c) == 0 ) return [tuple(c,step)]; } else if(forbidden_cell[y][x]){ - } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.'||i>=4) { + } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.'||g.map[y,x]=='!'||i>=4) { q2 ~= new Pos(y,x); v[y][x]=true; } } } @@ -245,11 +246,11 @@ if(y==s.y && x==s.x && i<4) { char c = "UDRL"[i]; if( death.count(c) == 0 ) return [tuple(c,step)]; } else if(forbidden_cell[y][x]){ - } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.'||g.map[y,x]=='*'||i>=4) { + } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.'||g.map[y,x]=='*'||g.map[y,x]=='!'||i>=4) { q2 ~= new Pos(y,x); v[y][x]=true; } } }