Differences From Artifact [69c19d5fe197eaad]:
- File        
src/solver.d
- 2012-07-14 16:39:50 - part of checkin [fec7ddc502] on branch trunk - Refactoring for ease of changine main solver. (user: kinaba) [annotate]
 
To Artifact [4aac390deb513002]:
- File        
src/solver.d
- 2012-07-14 18:00:27 - part of checkin [6e4c06b018] on branch trunk - Solver supports trampoline. (user: kinaba) [annotate]
 
  136                                  if(!danger(p.y,p.x))                                 136                                  if(!danger(p.y,p.x))
  137                                          q ~= p;                                      137                                          q ~= p;
  138                          bool[][] v = new bool[][](g.map.H+2, g.map.W+2);             138                          bool[][] v = new bool[][](g.map.H+2, g.map.W+2);
  139                          foreach(p; q) v[p.y][p.x]=true;                              139                          foreach(p; q) v[p.y][p.x]=true;
  140                          for(int step=1; q.length; ++step) {                          140                          for(int step=1; q.length; ++step) {
  141                                  Pos[] q2;                                            141                                  Pos[] q2;
  142                                  foreach(p; q) {                                      142                                  foreach(p; q) {
  143                                          int[] dy=[-1,+1,0,0];                    |   143                                          int[] yyy=[p.y-1,p.y+1,p.y,p.y];
  144                                          int[] dx=[0,0,-1,+1];                    |   144                                          int[] xxx=[p.x,p.x,p.x-1,p.x+1];
  145                                          for(int i=0; i<4; ++i) {                 |   145                                          for(int i=0; i<yyy.length; ++i) {
  146                                                  int y = p.y+dy[i];               |   146                                                  int y = yyy[i];
  147                                                  int x = p.x+dx[i];               |   147                                                  int x = xxx[i];
                                                                                        >   148                                                  if('1'<=g.map[y,x]&&g.map[y,x]<=
                                                                                        >   149                                                          foreach(ppp; g.map.tr_so
                                                                                        >   150                                                                  yyy ~= ppp.y;
                                                                                        >   151                                                                  xxx ~= ppp.x;
                                                                                        >   152                                                          }
                                                                                        >   153                                                          continue;
                                                                                        >   154                                                  }
  148                                                  if(v[y][x]) continue;                155                                                  if(v[y][x]) continue;
  149                                                  if(y==s.y && x==s.x) {           |   156                                                  if(y==s.y && x==s.x && i<4) {
  150                                                          char c = "UDRL"[i];          157                                                          char c = "UDRL"[i];
  151                                                          if( death.count(c) == 0      158                                                          if( death.count(c) == 0 
  152                                                                  return [tuple(c,     159                                                                  return [tuple(c,
  153                                                  } else if(forbidden_cell[y][x]){     160                                                  } else if(forbidden_cell[y][x]){
  154                                                  } else if(g.map[y,x]==' '||g.map |   161                                                  } else if(g.map[y,x]==' '||g.map
  155                                                          if(danger(y,x))              162                                                          if(danger(y,x))
  156                                                                  continue;            163                                                                  continue;
  157                                                          q2 ~= new Pos(y,x);          164                                                          q2 ~= new Pos(y,x);
  158                                                          v[y][x]=true;                165                                                          v[y][x]=true;
  159                                                  }                                    166                                                  }
  160                                          }                                            167                                          }
  161                                  }                                                    168                                  }
................................................................................................................................................................................
  169                          const(Pos)[] q;                                              176                          const(Pos)[] q;
  170                          foreach(p; gs) q ~= p;                                       177                          foreach(p; gs) q ~= p;
  171                          bool[][] v = new bool[][](g.map.H+2, g.map.W+2);             178                          bool[][] v = new bool[][](g.map.H+2, g.map.W+2);
  172                          foreach(p; q) v[p.y][p.x]=true;                              179                          foreach(p; q) v[p.y][p.x]=true;
  173                          for(int step=10; q.length; ++step) {                         180                          for(int step=10; q.length; ++step) {
  174                                  Pos[] q2;                                            181                                  Pos[] q2;
  175                                  foreach(p; q) {                                      182                                  foreach(p; q) {
  176                                          int[] dy=[-1,+1,0,0];                    |   183                                          int[] yyy=[p.y-1,p.y+1,p.y,p.y];
  177                                          int[] dx=[0,0,-1,+1];                    |   184                                          int[] xxx=[p.x,p.x,p.x-1,p.x+1];
  178                                          for(int i=0; i<4; ++i) {                 |   185                                          for(int i=0; i<yyy.length; ++i) {
  179                                                  int y = p.y+dy[i];               |   186                                                  int y = yyy[i];
  180                                                  int x = p.x+dx[i];               |   187                                                  int x = xxx[i];
                                                                                        >   188                                                  if('1'<=g.map[y,x]&&g.map[y,x]<=
                                                                                        >   189                                                          foreach(ppp; g.map.tr_so
                                                                                        >   190                                                                  yyy ~= ppp.y;
                                                                                        >   191                                                                  xxx ~= ppp.x;
                                                                                        >   192                                                          }
                                                                                        >   193                                                          continue;
                                                                                        >   194                                                  }
  181                                                  if(v[y][x]) continue;                195                                                  if(v[y][x]) continue;
  182                                                  if(y==s.y && x==s.x) {           |   196                                                  if(y==s.y && x==s.x && i<4) {
  183                                                          char c = "UDRL"[i];          197                                                          char c = "UDRL"[i];
  184                                                          if( death.count(c) == 0      198                                                          if( death.count(c) == 0 
  185                                                                  return [tuple(c,     199                                                                  return [tuple(c,
  186                                                  } else if(forbidden_cell[y][x]){     200                                                  } else if(forbidden_cell[y][x]){
  187                                                  } else if(g.map[y,x]==' '||g.map |   201                                                  } else if(g.map[y,x]==' '||g.map
  188                                                          q2 ~= new Pos(y,x);          202                                                          q2 ~= new Pos(y,x);
  189                                                          v[y][x]=true;                203                                                          v[y][x]=true;
  190                                                  }                                    204                                                  }
  191                                          }                                            205                                          }
  192                                  }                                                    206                                  }
  193                                  q = q2;                                              207                                  q = q2;
  194                          }                                                            208                          }
................................................................................................................................................................................
  200                          const(Pos)[] q;                                              214                          const(Pos)[] q;
  201                          foreach(p; gs) q ~= p;                                       215                          foreach(p; gs) q ~= p;
  202                          bool[][] v = new bool[][](g.map.H+2, g.map.W+2);             216                          bool[][] v = new bool[][](g.map.H+2, g.map.W+2);
  203                          foreach(p; q) v[p.y][p.x]=true;                              217                          foreach(p; q) v[p.y][p.x]=true;
  204                          for(int step=20; q.length; ++step) {                         218                          for(int step=20; q.length; ++step) {
  205                                  Pos[] q2;                                            219                                  Pos[] q2;
  206                                  foreach(p; q) {                                      220                                  foreach(p; q) {
  207                                          int[] dy=[-1,+1,0,0];                    |   221                                          int[] yyy=[p.y-1,p.y+1,p.y,p.y];
  208                                          int[] dx=[0,0,-1,+1];                    |   222                                          int[] xxx=[p.x,p.x,p.x-1,p.x+1];
  209                                          for(int i=0; i<4; ++i) {                 |   223                                          for(int i=0; i<yyy.length; ++i) {
  210                                                  int y = p.y+dy[i];               |   224                                                  int y = yyy[i];
  211                                                  int x = p.x+dx[i];               |   225                                                  int x = xxx[i];
                                                                                        >   226                                                  if('1'<=g.map[y,x]&&g.map[y,x]<=
                                                                                        >   227                                                          foreach(ppp; g.map.tr_so
                                                                                        >   228                                                                  yyy ~= ppp.y;
                                                                                        >   229                                                                  xxx ~= ppp.x;
                                                                                        >   230                                                          }
                                                                                        >   231                                                          continue;
                                                                                        >   232                                                  }
  212                                                  if(v[y][x]) continue;                233                                                  if(v[y][x]) continue;
  213                                                  if(y==s.y && x==s.x) {           |   234                                                  if(y==s.y && x==s.x && i<4) {
  214                                                          char c = "UDRL"[i];          235                                                          char c = "UDRL"[i];
  215                                                          if( death.count(c) == 0      236                                                          if( death.count(c) == 0 
  216                                                                  return [tuple(c,     237                                                                  return [tuple(c,
  217                                                  } else if(forbidden_cell[y][x]){     238                                                  } else if(forbidden_cell[y][x]){
  218                                                  } else if(g.map[y,x]==' '||g.map |   239                                                  } else if(g.map[y,x]==' '||g.map
  219                                                          q2 ~= new Pos(y,x);          240                                                          q2 ~= new Pos(y,x);
  220                                                          v[y][x]=true;                241                                                          v[y][x]=true;
  221                                                  } else if(dy[i]==0 && g.map[p]== |   242                                                  } else if(i<4 && (y-p.y)==0 && g
  222                                                          q2 ~= new Pos(y,x);          243                                                          q2 ~= new Pos(y,x);
  223                                                          v[y][x]=true;                244                                                          v[y][x]=true;
  224                                                  }                                    245                                                  }
  225                                          }                                            246                                          }
  226                                  }                                                    247                                  }
  227                                  q = q2;                                              248                                  q = q2;
  228                          }                                                            249                          }