Differences From Artifact [0bb4050087a6fb3f]:
- File        
src/solver.d
- 2012-07-14 12:29:17 - part of checkin [9d4aca73fa] on branch trunk - GUI+Solver revived. (user: kinaba) [annotate]
 
 
To Artifact [e22cb888fb6353ea]:
- File        
src/solver.d
- 2012-07-14 13:02:03 - part of checkin [b4aceba693] on branch trunk - 1 step death move detector rev.1 (user: kinaba) [annotate]
 
 
    24     24    this(const(Game) g)
    25     25    {
    26     26     this.g = g.clone();
    27     27    }
    28     28   
    29     29    char single_step()
    30     30    {
    31         -  char c = act(g);
           31  +  char c = act(g, death_move(g));
    32     32     g.command(c);
    33     33     return c;
    34     34    }
    35     35   
    36         - char act(const(Game) g)
           36  + string death_move(const(Game) g)
           37  + {
           38  +  string death;
           39  +  foreach(char c; "UDLRW") {
           40  +   Game gg = g.clone();
           41  +   gg.command(c);
           42  +   if( !gg.cleared && gg.dead )
           43  +    death ~= c;
           44  +  }
           45  +  return death;
           46  + }
           47  +
           48  + char act(const(Game) g, string death)
    37     49    {
    38     50     const Pos   ro = g.map.robot;
    39     51     const Pos[] la = g.map.lambdas();
    40     52     const Pos   li = g.map.lift;
    41     53   
    42     54     char c = 'W';
    43     55     if( la.empty ) {
    44         -   auto r = search(g, ro, li);
           56  +   auto r = search(g, ro, li, death);
    45     57      c = r[0];
    46     58     } else {
    47     59      Tuple!(char,int)[] cand;
    48     60      foreach(lam; la)
    49         -    cand ~= search(g, ro, lam);
           61  +    cand ~= search(g, ro, lam, death);
    50     62      sort!((Tuple!(char,int) c1, Tuple!(char,int) c2){
    51     63       if(c1[1] != c2[1])
    52     64        return c1[1] < c2[1];
    53     65       return c1[0] < c2[0];
    54     66      })(cand);
    55     67      c = cand[0][0];
    56     68     }
................................................................................
    60     72       c = 'A';
    61     73     }
    62     74     else
    63     75      g_wc = 0;
    64     76     return c;
    65     77    }
    66     78   
    67         - Tuple!(char,int) search(in Game g, in Pos s, in Pos o)
           79  + Tuple!(char,int) search(in Game g, in Pos s, in Pos o, string death)
    68     80    {
    69     81     const(Pos)[] q = [o];
    70     82     bool[][] v = new bool[][](g.map.H+2, g.map.W+2);
    71     83     for(int step=1; q.length; ++step) {
    72     84      Pos[] q2;
    73     85      foreach(p; q) {
    74     86       int[] dy=[-1,+1,0,0];
    75     87       int[] dx=[0,0,-1,+1];
    76     88       for(int i=0; i<4; ++i) {
    77     89        int y = p.y+dy[i];
    78     90        int x = p.x+dx[i];
    79     91        if(v[y][x]) continue;
    80     92        if(y==s.y && x==s.x) {
    81         -      if(i==0) return tuple('U',step);
    82         -      if(i==1) return tuple('D',step);
    83         -      if(i==2) return tuple('R',step);
    84         -      if(i==3) return tuple('L',step);
           93  +      char c = "UDRL"[i];
           94  +      if( death.count(c) == 0 )
           95  +       return tuple(c,step);
    85     96        } else if(g.map[y,x]==' '||g.map[y,x]=='\\') {
    86     97         q2 ~= new Pos(y,x);
    87     98         v[y][x]=true;
    88     99        } else if(g.map[y,x]=='.' && g.map[y-1,x]!='*') {
    89    100         q2 ~= new Pos(y,x);
    90    101         v[y][x]=true;
    91    102        }
................................................................................
   101    112       int[] dy=[-1,+1,0,0];
   102    113       int[] dx=[0,0,-1,+1];
   103    114       for(int i=0; i<4; ++i) {
   104    115        int y = p.y+dy[i];
   105    116        int x = p.x+dx[i];
   106    117        if(v[y][x]) continue;
   107    118        if(y==s.y && x==s.x) {
   108         -      if(i==0) return tuple('U',step);
   109         -      if(i==1) return tuple('D',step);
   110         -      if(i==2) return tuple('R',step);
   111         -      if(i==3) return tuple('L',step);
          119  +      char c = "UDRL"[i];
          120  +      if( death.count(c) == 0 )
          121  +       return tuple(c,step);
   112    122        } else if(g.map[y,x]==' '||g.map[y,x]=='\\') {
   113    123         q2 ~= new Pos(y,x);
   114    124         v[y][x]=true;
   115    125        } else if(g.map[y,x]=='.'/* && g[y-1,x]!='*'*/) {
   116    126         q2 ~= new Pos(y,x);
   117    127         v[y][x]=true;
   118    128        }