Differences From Artifact [1e2f760afef7fe9f]:
- File
src/solver.d
- 2012-07-16 06:57:54 - part of checkin [50fc08d883] on branch trunk - Fast solver should go towards up (since it knows nothing about water...) (user: kinaba) [annotate]
To Artifact [b158ce3255b33a97]:
- File
src/solver.d
- 2012-07-16 07:16:59 - part of checkin [70423f9ad9] on branch trunk - horock-push mode. (user: kinaba) [annotate]
219 for(int x=1; x<=g.map.W; ++x) 219 for(int x=1; x<=g.map.W; ++x)
220 if(g.map[y,x]=='.') 220 if(g.map[y,x]=='.')
221 if(is_rocky(g.map[y+1,x])||is_rocky(g.ma 221 if(is_rocky(g.map[y+1,x])||is_rocky(g.ma
222 ||is_rocky(g.map[y,x+1])||is_rocky(g.ma 222 ||is_rocky(g.map[y,x+1])||is_rocky(g.ma
223 tgt ~= new Pos(y,x); 223 tgt ~= new Pos(y,x);
224 cand ~= search(g, ro, tgt, death, true); 224 cand ~= search(g, ro, tgt, death, true);
225 } 225 }
> 226
> 227 // 'horo-push' mode
> 228 if(cand.empty) {
> 229 Pos[] horo = g.map.objects('@');
> 230 if(!horo.empty) {
> 231 cand ~= search(g, ro, horo, death, true);
> 232 }
> 233 }
226 234
227 if(cand.empty) { 235 if(cand.empty) {
228 choke_count++; 236 choke_count++;
229 cand ~= tuple('W',int.max); 237 cand ~= tuple('W',int.max);
230 } 238 }
231 sort!((Tuple!(char,int) c1, Tuple!(char,int) c2){ 239 sort!((Tuple!(char,int) c1, Tuple!(char,int) c2){
232 if(c1[1] != c2[1]) 240 if(c1[1] != c2[1])
................................................................................................................................................................................
294 Tuple!(char,int)[] tryA() { 302 Tuple!(char,int)[] tryA() {
295 const(Pos)[] q; 303 const(Pos)[] q;
296 foreach(p; gs) 304 foreach(p; gs)
297 if(!danger(p.y,p.x)) 305 if(!danger(p.y,p.x))
298 q ~= p; 306 q ~= p;
299 bool[][] v = new bool[][](g.map.H+2, g.map.W+2); 307 bool[][] v = new bool[][](g.map.H+2, g.map.W+2);
300 foreach(p; q) v[p.y][p.x]=true; 308 foreach(p; q) v[p.y][p.x]=true;
> 309 bool first_step = true;
301 for(int step=1; q.length; ++step) { 310 for(int step=1; q.length; ++step) {
302 Pos[] q2; 311 Pos[] q2;
303 foreach(p; q) { 312 foreach(p; q) {
304 int[] yyy=[p.y-1,p.y,p.y,p.y+1]; 313 int[] yyy=[p.y-1,p.y,p.y,p.y+1];
305 int[] xxx=[p.x,p.x-1,p.x+1,p.x]; 314 int[] xxx=[p.x,p.x-1,p.x+1,p.x];
306 string sss="URLD"; 315 string sss="URLD";
307 for(int i=0; i<yyy.length; ++i) { | 316 for(int i=0; i<yyy.length; ++i) if(!firs
308 int y = yyy[i]; 317 int y = yyy[i];
309 int x = xxx[i]; 318 int x = xxx[i];
310 if('1'<=g.map[y,x]&&g.map[y,x]<= 319 if('1'<=g.map[y,x]&&g.map[y,x]<=
311 foreach(ppp; g.tr.source 320 foreach(ppp; g.tr.source
312 yyy ~= ppp.y; 321 yyy ~= ppp.y;
313 xxx ~= ppp.x; 322 xxx ~= ppp.x;
314 } 323 }
................................................................................................................................................................................
324 if(danger(y,x)) 333 if(danger(y,x))
325 continue; 334 continue;
326 q2 ~= new Pos(y,x); 335 q2 ~= new Pos(y,x);
327 v[y][x]=true; 336 v[y][x]=true;
328 } 337 }
329 } 338 }
330 } 339 }
> 340 first_step = false;
331 q = q2; 341 q = q2;
332 } 342 }
333 return []; 343 return [];
334 } 344 }
335 345
336 // any empty space is my ground 346 // any empty space is my ground
337 Tuple!(char,int)[] tryB() { 347 Tuple!(char,int)[] tryB() {
338 const(Pos)[] q; 348 const(Pos)[] q;
339 foreach(p; gs) q ~= p; 349 foreach(p; gs) q ~= p;
340 bool[][] v = new bool[][](g.map.H+2, g.map.W+2); 350 bool[][] v = new bool[][](g.map.H+2, g.map.W+2);
341 foreach(p; q) v[p.y][p.x]=true; 351 foreach(p; q) v[p.y][p.x]=true;
> 352 bool first_step = true;
342 for(int step=8; q.length; ++step) { 353 for(int step=8; q.length; ++step) {
343 Pos[] q2; 354 Pos[] q2;
344 foreach(p; q) { 355 foreach(p; q) {
345 int[] yyy=[p.y-1,p.y,p.y,p.y+1]; 356 int[] yyy=[p.y-1,p.y,p.y,p.y+1];
346 int[] xxx=[p.x,p.x-1,p.x+1,p.x]; 357 int[] xxx=[p.x,p.x-1,p.x+1,p.x];
347 string sss="URLD"; 358 string sss="URLD";
348 for(int i=0; i<yyy.length; ++i) { | 359 for(int i=0; i<yyy.length; ++i) if(!firs
349 int y = yyy[i]; 360 int y = yyy[i];
350 int x = xxx[i]; 361 int x = xxx[i];
351 if('1'<=g.map[y,x]&&g.map[y,x]<= 362 if('1'<=g.map[y,x]&&g.map[y,x]<=
352 foreach(ppp; g.tr.source 363 foreach(ppp; g.tr.source
353 yyy ~= ppp.y; 364 yyy ~= ppp.y;
354 xxx ~= ppp.x; 365 xxx ~= ppp.x;
355 } 366 }
................................................................................................................................................................................
363 } else if(forbidden_cell[y][x]){ 374 } else if(forbidden_cell[y][x]){
364 } else if(g.map[y,x]==' '||g.map 375 } else if(g.map[y,x]==' '||g.map
365 q2 ~= new Pos(y,x); 376 q2 ~= new Pos(y,x);
366 v[y][x]=true; 377 v[y][x]=true;
367 } 378 }
368 } 379 }
369 } 380 }
> 381 first_step = false;
370 q = q2; 382 q = q2;
371 } 383 }
372 return []; 384 return [];
373 } 385 }
374 386
375 // push rocks! 387 // push rocks!
376 Tuple!(char,int)[] tryC() { 388 Tuple!(char,int)[] tryC() {
377 const(Pos)[] q; 389 const(Pos)[] q;
378 foreach(p; gs) q ~= p; 390 foreach(p; gs) q ~= p;
379 bool[][] v = new bool[][](g.map.H+2, g.map.W+2); 391 bool[][] v = new bool[][](g.map.H+2, g.map.W+2);
380 foreach(p; q) v[p.y][p.x]=true; 392 foreach(p; q) v[p.y][p.x]=true;
> 393 bool first_step = true;
381 for(int step=20; q.length; ++step) { 394 for(int step=20; q.length; ++step) {
382 Pos[] q2; 395 Pos[] q2;
383 foreach(p; q) { 396 foreach(p; q) {
384 int[] yyy=[p.y-1,p.y,p.y,p.y+1]; 397 int[] yyy=[p.y-1,p.y,p.y,p.y+1];
385 int[] xxx=[p.x,p.x-1,p.x+1,p.x]; 398 int[] xxx=[p.x,p.x-1,p.x+1,p.x];
386 string sss="URLD"; 399 string sss="URLD";
387 for(int i=0; i<yyy.length; ++i) { | 400 for(int i=0; i<yyy.length; ++i) if(!firs
388 int y = yyy[i]; 401 int y = yyy[i];
389 int x = xxx[i]; 402 int x = xxx[i];
390 if(is_rocky(g.map[p])) { 403 if(is_rocky(g.map[p])) {
391 if(i>=4)continue; 404 if(i>=4)continue;
392 if(y!=p.y)continue; 405 if(y!=p.y)continue;
393 if(g.map[y,p.x+(p.x-x)]! 406 if(g.map[y,p.x+(p.x-x)]!
394 } 407 }
................................................................................................................................................................................
407 } else if(forbidden_cell[y][x]){ 420 } else if(forbidden_cell[y][x]){
408 } else if(g.map[y,x]==' '||g.map 421 } else if(g.map[y,x]==' '||g.map
409 q2 ~= new Pos(y,x); 422 q2 ~= new Pos(y,x);
410 v[y][x]=true; 423 v[y][x]=true;
411 } 424 }
412 } 425 }
413 } 426 }
> 427 first_step = false;
414 q = q2; 428 q = q2;
415 } 429 }
416 return []; 430 return [];
417 } 431 }
418 return (danger_ok ? [] : tryA()) ~ tryB() ~ tryC(); 432 return (danger_ok ? [] : tryA()) ~ tryB() ~ tryC();
419 } 433 }
420 } 434 }