Differences From Artifact [accda2201a6a857e]:
- File
src/solver.d
- 2012-07-16 08:06:06 - part of checkin [3893826f55] on branch trunk - dangerness loosened. (user: kinaba) [annotate]
To Artifact [da568e3b806540de]:
- File
src/solver.d
- 2012-07-16 08:59:54 - part of checkin [9e34cad783] on branch trunk - One-way road finder. (user: kinaba) [annotate]
162 162 }
163 163
164 164 Tuple!(Pos, int)[] log;
165 165 bool[][] forbidden_cell;
166 166
167 167 char act(const(Game) g, string death, int breath)
168 168 {
169 + foreach(char c; "UDLR")
170 + if( death.count(c)==0 && is_one_way_load(g,c) )
171 + return c;
172 +
169 173 const Pos ro = g.map.robot;
170 174 const Pos li = g.map.lift;
171 175 Pos[] la = g.map.lambdas();
172 176 sort!((Pos a,Pos b){
173 177 int ad=abs(a.y-li.y)+abs(a.x-li.x);
174 178 int bd=abs(b.y-li.y)+abs(b.x-li.x);
175 179 return ad>bd;;
................................................................................
448 452 first_step = false;
449 453 q = q2;
450 454 }
451 455 return [];
452 456 }
453 457 return (danger_ok ? [] : tryA()) ~ tryB() ~ tryC();
454 458 }
459 +
460 + bool is_one_way_load(in Game g, char c)
461 + {
462 + Pos p = g.map.robot.clone();
463 + Pos q;
464 + if(c=='U') q=new Pos(p.y+1,p.x);
465 + if(c=='D') q=new Pos(p.y-1,p.x);
466 + if(c=='L') q=new Pos(p.y,p.x-1);
467 + if(c=='R') q=new Pos(p.y,p.x+1);
468 + char d = g.map[q];
469 + if(!(d==' '||d=='.'||d=='!'))
470 + return false;
471 +
472 + bool found_lambda = false;
473 + int[4] dy=[-1,+1,0,0];
474 + int[4] dx=[0,0,+1,-1];
475 + for(;;)
476 + {
477 + Pos r = null;
478 + for(int i=0; i<4; ++i) {
479 + int y=q.y+dy[i];
480 + int x=q.x+dx[i];
481 + if(x==p.x && y==p.y)
482 + continue;
483 + char e = g.map[y,x];
484 + if(e=='#')
485 + continue;
486 + if(e==' '||e=='.'||e=='!'||e=='R'||e=='\\') {
487 + if(r !is null)
488 + return false;
489 + r = new Pos(y,x);
490 + if(e=='\\')
491 + found_lambda = true;
492 + continue;
493 + }
494 + return false;
495 + }
496 + if(r is null)
497 + break;
498 + p=q;
499 + q=r;
500 + }
501 + return found_lambda;
502 + }
455 503 }
456 504
457 505 ///
458 506 /// Solver "Fire": in raiding and plundering other solvers, be like fire.
459 507 ///
460 508 class 侵掠如火(SubSolver) : Solver
461 509 {
................................................................................
759 807
760 808 private Solver sub_solver;
761 809 }
762 810
763 811 alias 侵掠如火!(疾如風!(false)) FastSolver;
764 812
765 813 alias Switcher MainSolver;
766 -//alias 侵掠如火!(徐如林) MainSolver;
814 +//alias 徐如林 MainSolver;