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 136 if(!danger(p.y,p.x))
137 137 q ~= p;
138 138 bool[][] v = new bool[][](g.map.H+2, g.map.W+2);
139 139 foreach(p; q) v[p.y][p.x]=true;
140 140 for(int step=1; q.length; ++step) {
141 141 Pos[] q2;
142 142 foreach(p; q) {
143 - int[] dy=[-1,+1,0,0];
144 - int[] dx=[0,0,-1,+1];
145 - for(int i=0; i<4; ++i) {
146 - int y = p.y+dy[i];
147 - int x = p.x+dx[i];
143 + int[] yyy=[p.y-1,p.y+1,p.y,p.y];
144 + int[] xxx=[p.x,p.x,p.x-1,p.x+1];
145 + for(int i=0; i<yyy.length; ++i) {
146 + int y = yyy[i];
147 + int x = xxx[i];
148 + if('1'<=g.map[y,x]&&g.map[y,x]<='9') {
149 + foreach(ppp; g.map.tr_source[g.map[y,x]]) {
150 + yyy ~= ppp.y;
151 + xxx ~= ppp.x;
152 + }
153 + continue;
154 + }
148 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 157 char c = "UDRL"[i];
151 158 if( death.count(c) == 0 )
152 159 return [tuple(c,step)];
153 160 } else if(forbidden_cell[y][x]){
154 - } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.') {
161 + } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.'||i>=4) {
155 162 if(danger(y,x))
156 163 continue;
157 164 q2 ~= new Pos(y,x);
158 165 v[y][x]=true;
159 166 }
160 167 }
161 168 }
................................................................................
169 176 const(Pos)[] q;
170 177 foreach(p; gs) q ~= p;
171 178 bool[][] v = new bool[][](g.map.H+2, g.map.W+2);
172 179 foreach(p; q) v[p.y][p.x]=true;
173 180 for(int step=10; q.length; ++step) {
174 181 Pos[] q2;
175 182 foreach(p; q) {
176 - int[] dy=[-1,+1,0,0];
177 - int[] dx=[0,0,-1,+1];
178 - for(int i=0; i<4; ++i) {
179 - int y = p.y+dy[i];
180 - int x = p.x+dx[i];
183 + int[] yyy=[p.y-1,p.y+1,p.y,p.y];
184 + int[] xxx=[p.x,p.x,p.x-1,p.x+1];
185 + for(int i=0; i<yyy.length; ++i) {
186 + int y = yyy[i];
187 + int x = xxx[i];
188 + if('1'<=g.map[y,x]&&g.map[y,x]<='9') {
189 + foreach(ppp; g.map.tr_source[g.map[y,x]]) {
190 + yyy ~= ppp.y;
191 + xxx ~= ppp.x;
192 + }
193 + continue;
194 + }
181 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 197 char c = "UDRL"[i];
184 198 if( death.count(c) == 0 )
185 199 return [tuple(c,step)];
186 200 } else if(forbidden_cell[y][x]){
187 - } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.') {
201 + } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.'||i>=4) {
188 202 q2 ~= new Pos(y,x);
189 203 v[y][x]=true;
190 204 }
191 205 }
192 206 }
193 207 q = q2;
194 208 }
................................................................................
200 214 const(Pos)[] q;
201 215 foreach(p; gs) q ~= p;
202 216 bool[][] v = new bool[][](g.map.H+2, g.map.W+2);
203 217 foreach(p; q) v[p.y][p.x]=true;
204 218 for(int step=20; q.length; ++step) {
205 219 Pos[] q2;
206 220 foreach(p; q) {
207 - int[] dy=[-1,+1,0,0];
208 - int[] dx=[0,0,-1,+1];
209 - for(int i=0; i<4; ++i) {
210 - int y = p.y+dy[i];
211 - int x = p.x+dx[i];
221 + int[] yyy=[p.y-1,p.y+1,p.y,p.y];
222 + int[] xxx=[p.x,p.x,p.x-1,p.x+1];
223 + for(int i=0; i<yyy.length; ++i) {
224 + int y = yyy[i];
225 + int x = xxx[i];
226 + if('1'<=g.map[y,x]&&g.map[y,x]<='9') {
227 + foreach(ppp; g.map.tr_source[g.map[y,x]]) {
228 + yyy ~= ppp.y;
229 + xxx ~= ppp.x;
230 + }
231 + continue;
232 + }
212 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 235 char c = "UDRL"[i];
215 236 if( death.count(c) == 0 )
216 237 return [tuple(c,step)];
217 238 } else if(forbidden_cell[y][x]){
218 - } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.') {
239 + } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.'||i>=4) {
219 240 q2 ~= new Pos(y,x);
220 241 v[y][x]=true;
221 - } else if(dy[i]==0 && g.map[p]==' ' && g.map[y,x]=='*' && (g.map[y+dy[i],x+dx[i]]==' '||g.map[y+dy[i],x+dx[i]]=='R')) {
242 + } else if(i<4 && (y-p.y)==0 && g.map[p]==' ' && g.map[y,x]=='*' && (g.map[y+(y-p.y),x+(x-p.x)]==' '||g.map[y+(y-p.y),x+(x-p.x)]=='R')) {
222 243 q2 ~= new Pos(y,x);
223 244 v[y][x]=true;
224 245 }
225 246 }
226 247 }
227 248 q = q2;
228 249 }