Hex Artifact Content
Not logged in

Artifact 3df785b1c14144329cc877abf9b2001f4ebd69d7:


0000: 69 6d 70 6f 72 74 20 75 74 69 6c 3b 0a 69 6d 70  import util;.imp
0010: 6f 72 74 20 67 61 6d 65 3b 0a 69 6d 70 6f 72 74  ort game;.import
0020: 20 64 72 69 76 65 72 3b 0a 0a 2f 2a 0a 69 6e 74   driver;../*.int
0030: 65 72 66 61 63 65 20 53 6f 6c 76 65 72 0a 7b 0a  erface Solver.{.
0040: 09 74 68 69 73 28 63 6f 6e 73 74 28 47 61 6d 65  .this(const(Game
0050: 29 20 67 29 3b 0a 09 63 68 61 72 20 73 69 6e 67  ) g);..char sing
0060: 6c 65 5f 73 74 65 70 28 29 3b 0a 7d 0a 2a 2f 0a  le_step();.}.*/.
0070: 0a 63 6c 61 73 73 20 53 6f 6c 76 65 72 5f 30 0a  .class Solver_0.
0080: 7b 0a 09 74 68 69 73 28 63 6f 6e 73 74 28 47 61  {..this(const(Ga
0090: 6d 65 29 20 67 29 20 7b 7d 0a 09 63 68 61 72 20  me) g) {}..char 
00a0: 73 69 6e 67 6c 65 5f 73 74 65 70 28 29 20 7b 20  single_step() { 
00b0: 72 65 74 75 72 6e 20 27 57 27 3b 20 7d 0a 7d 0a  return 'W'; }.}.
00c0: 0a 63 6c 61 73 73 20 53 6f 6c 76 65 72 5f 31 0a  .class Solver_1.
00d0: 7b 0a 09 69 6e 74 20 67 5f 77 63 20 3d 20 30 3b  {..int g_wc = 0;
00e0: 0a 0a 09 47 61 6d 65 20 67 3b 0a 09 74 68 69 73  ...Game g;..this
00f0: 28 63 6f 6e 73 74 28 47 61 6d 65 29 20 67 29 0a  (const(Game) g).
0100: 09 7b 0a 09 09 74 68 69 73 2e 67 20 3d 20 67 2e  .{...this.g = g.
0110: 63 6c 6f 6e 65 28 29 3b 0a 09 7d 0a 0a 09 63 68  clone();..}...ch
0120: 61 72 20 73 69 6e 67 6c 65 5f 73 74 65 70 28 29  ar single_step()
0130: 0a 09 7b 0a 09 09 63 68 61 72 20 63 20 3d 20 61  ..{...char c = a
0140: 63 74 28 67 2c 20 64 65 61 74 68 5f 6d 6f 76 65  ct(g, death_move
0150: 28 67 29 29 3b 0a 09 09 67 2e 63 6f 6d 6d 61 6e  (g));...g.comman
0160: 64 28 63 29 3b 0a 09 09 72 65 74 75 72 6e 20 63  d(c);...return c
0170: 3b 0a 09 7d 0a 0a 09 73 74 72 69 6e 67 20 64 65  ;..}...string de
0180: 61 74 68 5f 6d 6f 76 65 28 63 6f 6e 73 74 28 47  ath_move(const(G
0190: 61 6d 65 29 20 67 29 0a 09 7b 0a 09 09 73 74 72  ame) g)..{...str
01a0: 69 6e 67 20 64 65 61 74 68 3b 0a 09 09 66 6f 72  ing death;...for
01b0: 65 61 63 68 28 63 68 61 72 20 63 3b 20 22 55 44  each(char c; "UD
01c0: 4c 52 57 22 29 20 7b 0a 09 09 09 47 61 6d 65 20  LRW") {....Game 
01d0: 67 67 20 3d 20 67 2e 63 6c 6f 6e 65 28 29 3b 0a  gg = g.clone();.
01e0: 09 09 09 67 67 2e 63 6f 6d 6d 61 6e 64 28 63 29  ...gg.command(c)
01f0: 3b 0a 09 09 09 69 66 28 20 21 67 67 2e 63 6c 65  ;....if( !gg.cle
0200: 61 72 65 64 20 26 26 20 67 67 2e 64 65 61 64 20  ared && gg.dead 
0210: 29 0a 09 09 09 09 64 65 61 74 68 20 7e 3d 20 63  ).....death ~= c
0220: 3b 0a 09 09 7d 0a 09 09 72 65 74 75 72 6e 20 64  ;...}...return d
0230: 65 61 74 68 3b 0a 09 7d 0a 0a 09 63 68 61 72 20  eath;..}...char 
0240: 61 63 74 28 63 6f 6e 73 74 28 47 61 6d 65 29 20  act(const(Game) 
0250: 67 2c 20 73 74 72 69 6e 67 20 64 65 61 74 68 29  g, string death)
0260: 0a 09 7b 0a 09 09 63 6f 6e 73 74 20 50 6f 73 20  ..{...const Pos 
0270: 20 20 72 6f 20 3d 20 67 2e 6d 61 70 2e 72 6f 62    ro = g.map.rob
0280: 6f 74 3b 0a 09 09 63 6f 6e 73 74 20 50 6f 73 5b  ot;...const Pos[
0290: 5d 20 6c 61 20 3d 20 67 2e 6d 61 70 2e 6c 61 6d  ] la = g.map.lam
02a0: 62 64 61 73 28 29 3b 0a 09 09 63 6f 6e 73 74 20  bdas();...const 
02b0: 50 6f 73 20 20 20 6c 69 20 3d 20 67 2e 6d 61 70  Pos   li = g.map
02c0: 2e 6c 69 66 74 3b 0a 0a 09 09 54 75 70 6c 65 21  .lift;....Tuple!
02d0: 28 63 68 61 72 2c 69 6e 74 29 5b 5d 20 63 61 6e  (char,int)[] can
02e0: 64 3b 0a 09 09 63 68 61 72 20 63 20 3d 20 27 57  d;...char c = 'W
02f0: 27 3b 0a 09 09 69 66 28 20 6c 61 2e 65 6d 70 74  ';...if( la.empt
0300: 79 20 29 20 7b 0a 09 09 09 63 61 6e 64 20 3d 20  y ) {....cand = 
0310: 73 65 61 72 63 68 28 67 2c 20 72 6f 2c 20 6c 69  search(g, ro, li
0320: 2c 20 64 65 61 74 68 29 3b 0a 09 09 7d 20 65 6c  , death);...} el
0330: 73 65 20 7b 0a 09 09 09 66 6f 72 65 61 63 68 28  se {....foreach(
0340: 6c 61 6d 3b 20 6c 61 29 0a 09 09 09 09 63 61 6e  lam; la).....can
0350: 64 20 7e 3d 20 73 65 61 72 63 68 28 67 2c 20 72  d ~= search(g, r
0360: 6f 2c 20 6c 61 6d 2c 20 64 65 61 74 68 29 3b 0a  o, lam, death);.
0370: 09 09 7d 0a 09 09 73 6f 72 74 21 28 28 54 75 70  ..}...sort!((Tup
0380: 6c 65 21 28 63 68 61 72 2c 69 6e 74 29 20 63 31  le!(char,int) c1
0390: 2c 20 54 75 70 6c 65 21 28 63 68 61 72 2c 69 6e  , Tuple!(char,in
03a0: 74 29 20 63 32 29 7b 0a 09 09 09 69 66 28 63 31  t) c2){....if(c1
03b0: 5b 31 5d 20 21 3d 20 63 32 5b 31 5d 29 0a 09 09  [1] != c2[1])...
03c0: 09 09 72 65 74 75 72 6e 20 63 31 5b 31 5d 20 3c  ..return c1[1] <
03d0: 20 63 32 5b 31 5d 3b 0a 09 09 09 72 65 74 75 72   c2[1];....retur
03e0: 6e 20 63 31 5b 30 5d 20 3c 20 63 32 5b 30 5d 3b  n c1[0] < c2[0];
03f0: 0a 09 09 7d 29 28 63 61 6e 64 29 3b 0a 09 09 63  ...})(cand);...c
0400: 20 3d 20 63 61 6e 64 5b 30 5d 5b 30 5d 3b 0a 0a   = cand[0][0];..
0410: 09 09 69 66 28 63 3d 3d 27 57 27 29 20 7b 0a 09  ..if(c=='W') {..
0420: 09 09 67 5f 77 63 2b 2b 3b 0a 09 09 09 69 66 28  ..g_wc++;....if(
0430: 67 5f 77 63 20 3e 20 31 30 29 0a 09 09 09 09 63  g_wc > 10).....c
0440: 20 3d 20 27 41 27 3b 0a 09 09 7d 0a 09 09 65 6c   = 'A';...}...el
0450: 73 65 0a 09 09 09 67 5f 77 63 20 3d 20 30 3b 0a  se....g_wc = 0;.
0460: 09 09 72 65 74 75 72 6e 20 63 3b 0a 09 7d 0a 0a  ..return c;..}..
0470: 09 54 75 70 6c 65 21 28 63 68 61 72 2c 69 6e 74  .Tuple!(char,int
0480: 29 5b 5d 20 73 65 61 72 63 68 28 69 6e 20 47 61  )[] search(in Ga
0490: 6d 65 20 67 2c 20 69 6e 20 50 6f 73 20 73 2c 20  me g, in Pos s, 
04a0: 69 6e 20 50 6f 73 20 6f 2c 20 73 74 72 69 6e 67  in Pos o, string
04b0: 20 64 65 61 74 68 29 0a 09 7b 0a 09 09 62 6f 6f   death)..{...boo
04c0: 6c 20 64 61 6e 67 65 72 28 69 6e 74 20 79 2c 20  l danger(int y, 
04d0: 69 6e 74 20 78 29 0a 09 09 7b 0a 09 09 09 69 66  int x)...{....if
04e0: 28 67 2e 6d 61 70 5b 79 2b 31 2c 78 5d 20 3d 3d  (g.map[y+1,x] ==
04f0: 20 27 2a 27 29 0a 09 09 09 09 72 65 74 75 72 6e   '*').....return
0500: 20 74 72 75 65 3b 0a 09 09 09 69 66 28 67 2e 6d   true;....if(g.m
0510: 61 70 5b 79 2b 31 2c 78 2d 31 5d 3d 3d 27 2a 27  ap[y+1,x-1]=='*'
0520: 20 26 26 20 28 67 2e 6d 61 70 5b 79 2c 78 2d 31   && (g.map[y,x-1
0530: 5d 3d 3d 27 5c 5c 27 7c 7c 67 2e 6d 61 70 5b 79  ]=='\\'||g.map[y
0540: 2c 78 2d 31 5d 3d 3d 27 2a 27 29 20 26 26 20 28  ,x-1]=='*') && (
0550: 67 2e 6d 61 70 5b 79 2b 31 2c 78 5d 3d 3d 27 20  g.map[y+1,x]==' 
0560: 27 7c 7c 67 2e 6d 61 70 5b 79 2b 31 2c 78 5d 3d  '||g.map[y+1,x]=
0570: 3d 27 52 27 29 29 0a 09 09 09 09 72 65 74 75 72  ='R')).....retur
0580: 6e 20 74 72 75 65 3b 0a 09 09 09 69 66 28 67 2e  n true;....if(g.
0590: 6d 61 70 5b 79 2b 31 2c 78 2b 31 5d 3d 3d 27 2a  map[y+1,x+1]=='*
05a0: 27 20 26 26 20 28 67 2e 6d 61 70 5b 79 2c 78 2b  ' && (g.map[y,x+
05b0: 31 5d 3d 3d 27 2a 27 29 20 26 26 20 28 67 2e 6d  1]=='*') && (g.m
05c0: 61 70 5b 79 2b 31 2c 78 5d 3d 3d 27 20 27 7c 7c  ap[y+1,x]==' '||
05d0: 67 2e 6d 61 70 5b 79 2b 31 2c 78 5d 3d 3d 27 52  g.map[y+1,x]=='R
05e0: 27 29 29 0a 09 09 09 09 72 65 74 75 72 6e 20 74  ')).....return t
05f0: 72 75 65 3b 0a 09 09 09 69 66 28 67 2e 6d 61 70  rue;....if(g.map
0600: 5b 79 2c 78 2d 31 5d 3d 3d 27 2a 27 20 26 26 20  [y,x-1]=='*' && 
0610: 28 67 2e 6d 61 70 5b 79 2d 31 2c 78 2d 31 5d 3d  (g.map[y-1,x-1]=
0620: 3d 27 5c 5c 27 7c 7c 67 2e 6d 61 70 5b 79 2d 31  ='\\'||g.map[y-1
0630: 2c 78 2d 31 5d 3d 3d 27 2a 27 29 20 26 26 20 28  ,x-1]=='*') && (
0640: 67 2e 6d 61 70 5b 79 2d 31 2c 78 5d 3d 3d 27 20  g.map[y-1,x]==' 
0650: 27 7c 7c 67 2e 6d 61 70 5b 79 2d 31 2c 78 5d 3d  '||g.map[y-1,x]=
0660: 3d 27 52 27 29 29 0a 09 09 09 09 72 65 74 75 72  ='R')).....retur
0670: 6e 20 74 72 75 65 3b 0a 09 09 09 69 66 28 67 2e  n true;....if(g.
0680: 6d 61 70 5b 79 2c 78 2b 31 5d 3d 3d 27 2a 27 20  map[y,x+1]=='*' 
0690: 26 26 20 28 67 2e 6d 61 70 5b 79 2d 31 2c 78 2b  && (g.map[y-1,x+
06a0: 31 5d 3d 3d 27 2a 27 29 20 26 26 20 28 67 2e 6d  1]=='*') && (g.m
06b0: 61 70 5b 79 2d 31 2c 78 5d 3d 3d 27 20 27 7c 7c  ap[y-1,x]==' '||
06c0: 67 2e 6d 61 70 5b 79 2d 31 2c 78 5d 3d 3d 27 52  g.map[y-1,x]=='R
06d0: 27 29 29 0a 09 09 09 09 72 65 74 75 72 6e 20 74  ')).....return t
06e0: 72 75 65 3b 0a 09 09 09 72 65 74 75 72 6e 20 66  rue;....return f
06f0: 61 6c 73 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2f 20  alse;...}....// 
0700: 61 76 6f 69 64 20 64 69 72 65 63 74 6c 79 20 62  avoid directly b
0710: 65 6c 6f 77 20 27 2a 27 0a 09 09 54 75 70 6c 65  elow '*'...Tuple
0720: 21 28 63 68 61 72 2c 69 6e 74 29 5b 5d 20 74 72  !(char,int)[] tr
0730: 79 41 28 29 20 7b 0a 09 09 09 63 6f 6e 73 74 28  yA() {....const(
0740: 50 6f 73 29 5b 5d 20 71 20 3d 20 5b 6f 5d 3b 0a  Pos)[] q = [o];.
0750: 09 09 09 62 6f 6f 6c 5b 5d 5b 5d 20 76 20 3d 20  ...bool[][] v = 
0760: 6e 65 77 20 62 6f 6f 6c 5b 5d 5b 5d 28 67 2e 6d  new bool[][](g.m
0770: 61 70 2e 48 2b 32 2c 20 67 2e 6d 61 70 2e 57 2b  ap.H+2, g.map.W+
0780: 32 29 3b 0a 09 09 09 69 66 28 20 21 64 61 6e 67  2);....if( !dang
0790: 65 72 28 6f 2e 79 2c 6f 2e 78 29 20 29 20 7b 0a  er(o.y,o.x) ) {.
07a0: 09 09 09 09 76 5b 6f 2e 79 5d 5b 6f 2e 78 5d 3d  ....v[o.y][o.x]=
07b0: 74 72 75 65 3b 0a 09 09 09 09 66 6f 72 28 69 6e  true;.....for(in
07c0: 74 20 73 74 65 70 3d 31 3b 20 71 2e 6c 65 6e 67  t step=1; q.leng
07d0: 74 68 3b 20 2b 2b 73 74 65 70 29 20 7b 0a 09 09  th; ++step) {...
07e0: 09 09 09 50 6f 73 5b 5d 20 71 32 3b 0a 09 09 09  ...Pos[] q2;....
07f0: 09 09 66 6f 72 65 61 63 68 28 70 3b 20 71 29 20  ..foreach(p; q) 
0800: 7b 0a 09 09 09 09 09 09 69 6e 74 5b 5d 20 64 79  {.......int[] dy
0810: 3d 5b 2d 31 2c 2b 31 2c 30 2c 30 5d 3b 0a 09 09  =[-1,+1,0,0];...
0820: 09 09 09 09 69 6e 74 5b 5d 20 64 78 3d 5b 30 2c  ....int[] dx=[0,
0830: 30 2c 2d 31 2c 2b 31 5d 3b 0a 09 09 09 09 09 09  0,-1,+1];.......
0840: 66 6f 72 28 69 6e 74 20 69 3d 30 3b 20 69 3c 34  for(int i=0; i<4
0850: 3b 20 2b 2b 69 29 20 7b 0a 09 09 09 09 09 09 09  ; ++i) {........
0860: 69 6e 74 20 79 20 3d 20 70 2e 79 2b 64 79 5b 69  int y = p.y+dy[i
0870: 5d 3b 0a 09 09 09 09 09 09 09 69 6e 74 20 78 20  ];........int x 
0880: 3d 20 70 2e 78 2b 64 78 5b 69 5d 3b 0a 09 09 09  = p.x+dx[i];....
0890: 09 09 09 09 69 66 28 76 5b 79 5d 5b 78 5d 29 20  ....if(v[y][x]) 
08a0: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 09 09  continue;.......
08b0: 09 69 66 28 79 3d 3d 73 2e 79 20 26 26 20 78 3d  .if(y==s.y && x=
08c0: 3d 73 2e 78 29 20 7b 0a 09 09 09 09 09 09 09 09  =s.x) {.........
08d0: 63 68 61 72 20 63 20 3d 20 22 55 44 52 4c 22 5b  char c = "UDRL"[
08e0: 69 5d 3b 0a 09 09 09 09 09 09 09 09 69 66 28 20  i];.........if( 
08f0: 64 65 61 74 68 2e 63 6f 75 6e 74 28 63 29 20 3d  death.count(c) =
0900: 3d 20 30 20 29 0a 09 09 09 09 09 09 09 09 09 72  = 0 )..........r
0910: 65 74 75 72 6e 20 5b 74 75 70 6c 65 28 63 2c 73  eturn [tuple(c,s
0920: 74 65 70 29 5d 3b 0a 09 09 09 09 09 09 09 7d 20  tep)];........} 
0930: 65 6c 73 65 20 69 66 28 67 2e 6d 61 70 5b 79 2c  else if(g.map[y,
0940: 78 5d 3d 3d 27 20 27 7c 7c 67 2e 6d 61 70 5b 79  x]==' '||g.map[y
0950: 2c 78 5d 3d 3d 27 5c 5c 27 7c 7c 67 2e 6d 61 70  ,x]=='\\'||g.map
0960: 5b 79 2c 78 5d 3d 3d 27 2e 27 29 20 7b 0a 09 09  [y,x]=='.') {...
0970: 09 09 09 09 09 09 69 66 28 64 61 6e 67 65 72 28  ......if(danger(
0980: 79 2c 78 29 29 0a 09 09 09 09 09 09 09 09 09 63  y,x))..........c
0990: 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 09 09 09  ontinue;........
09a0: 09 71 32 20 7e 3d 20 6e 65 77 20 50 6f 73 28 79  .q2 ~= new Pos(y
09b0: 2c 78 29 3b 0a 09 09 09 09 09 09 09 09 76 5b 79  ,x);.........v[y
09c0: 5d 5b 78 5d 3d 74 72 75 65 3b 0a 09 09 09 09 09  ][x]=true;......
09d0: 09 09 7d 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  ..}.......}.....
09e0: 09 7d 0a 09 09 09 09 09 71 20 3d 20 71 32 3b 0a  .}......q = q2;.
09f0: 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 09 72 65  ....}....}....re
0a00: 74 75 72 6e 20 5b 5d 3b 0a 09 09 7d 0a 0a 09 09  turn [];...}....
0a10: 2f 2f 20 61 6e 79 20 65 6d 70 74 79 20 73 70 61  // any empty spa
0a20: 63 65 20 69 73 20 6d 79 20 67 72 6f 75 6e 64 0a  ce is my ground.
0a30: 09 09 54 75 70 6c 65 21 28 63 68 61 72 2c 69 6e  ..Tuple!(char,in
0a40: 74 29 5b 5d 20 74 72 79 42 28 29 20 7b 0a 09 09  t)[] tryB() {...
0a50: 09 63 6f 6e 73 74 28 50 6f 73 29 5b 5d 20 71 20  .const(Pos)[] q 
0a60: 3d 20 5b 6f 5d 3b 0a 09 09 09 62 6f 6f 6c 5b 5d  = [o];....bool[]
0a70: 5b 5d 20 76 20 3d 20 6e 65 77 20 62 6f 6f 6c 5b  [] v = new bool[
0a80: 5d 5b 5d 28 67 2e 6d 61 70 2e 48 2b 32 2c 20 67  ][](g.map.H+2, g
0a90: 2e 6d 61 70 2e 57 2b 32 29 3b 0a 09 09 09 76 5b  .map.W+2);....v[
0aa0: 6f 2e 79 5d 5b 6f 2e 78 5d 3d 74 72 75 65 3b 0a  o.y][o.x]=true;.
0ab0: 09 09 09 66 6f 72 28 69 6e 74 20 73 74 65 70 3d  ...for(int step=
0ac0: 31 35 3b 20 71 2e 6c 65 6e 67 74 68 3b 20 2b 2b  15; q.length; ++
0ad0: 73 74 65 70 29 20 7b 0a 09 09 09 09 50 6f 73 5b  step) {.....Pos[
0ae0: 5d 20 71 32 3b 0a 09 09 09 09 66 6f 72 65 61 63  ] q2;.....foreac
0af0: 68 28 70 3b 20 71 29 20 7b 0a 09 09 09 09 09 69  h(p; q) {......i
0b00: 6e 74 5b 5d 20 64 79 3d 5b 2d 31 2c 2b 31 2c 30  nt[] dy=[-1,+1,0
0b10: 2c 30 5d 3b 0a 09 09 09 09 09 69 6e 74 5b 5d 20  ,0];......int[] 
0b20: 64 78 3d 5b 30 2c 30 2c 2d 31 2c 2b 31 5d 3b 0a  dx=[0,0,-1,+1];.
0b30: 09 09 09 09 09 66 6f 72 28 69 6e 74 20 69 3d 30  .....for(int i=0
0b40: 3b 20 69 3c 34 3b 20 2b 2b 69 29 20 7b 0a 09 09  ; i<4; ++i) {...
0b50: 09 09 09 09 69 6e 74 20 79 20 3d 20 70 2e 79 2b  ....int y = p.y+
0b60: 64 79 5b 69 5d 3b 0a 09 09 09 09 09 09 69 6e 74  dy[i];.......int
0b70: 20 78 20 3d 20 70 2e 78 2b 64 78 5b 69 5d 3b 0a   x = p.x+dx[i];.
0b80: 09 09 09 09 09 09 69 66 28 76 5b 79 5d 5b 78 5d  ......if(v[y][x]
0b90: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09  ) continue;.....
0ba0: 09 09 69 66 28 79 3d 3d 73 2e 79 20 26 26 20 78  ..if(y==s.y && x
0bb0: 3d 3d 73 2e 78 29 20 7b 0a 09 09 09 09 09 09 09  ==s.x) {........
0bc0: 63 68 61 72 20 63 20 3d 20 22 55 44 52 4c 22 5b  char c = "UDRL"[
0bd0: 69 5d 3b 0a 09 09 09 09 09 09 09 69 66 28 20 64  i];........if( d
0be0: 65 61 74 68 2e 63 6f 75 6e 74 28 63 29 20 3d 3d  eath.count(c) ==
0bf0: 20 30 20 29 0a 09 09 09 09 09 09 09 09 72 65 74   0 ).........ret
0c00: 75 72 6e 20 5b 74 75 70 6c 65 28 63 2c 73 74 65  urn [tuple(c,ste
0c10: 70 29 5d 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73  p)];.......} els
0c20: 65 20 69 66 28 67 2e 6d 61 70 5b 79 2c 78 5d 3d  e if(g.map[y,x]=
0c30: 3d 27 20 27 7c 7c 67 2e 6d 61 70 5b 79 2c 78 5d  =' '||g.map[y,x]
0c40: 3d 3d 27 5c 5c 27 7c 7c 67 2e 6d 61 70 5b 79 2c  =='\\'||g.map[y,
0c50: 78 5d 3d 3d 27 2e 27 29 20 7b 0a 09 09 09 09 09  x]=='.') {......
0c60: 09 09 71 32 20 7e 3d 20 6e 65 77 20 50 6f 73 28  ..q2 ~= new Pos(
0c70: 79 2c 78 29 3b 0a 09 09 09 09 09 09 09 76 5b 79  y,x);........v[y
0c80: 5d 5b 78 5d 3d 74 72 75 65 3b 0a 09 09 09 09 09  ][x]=true;......
0c90: 09 7d 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  .}......}.....}.
0ca0: 09 09 09 09 71 20 3d 20 71 32 3b 0a 09 09 09 7d  ....q = q2;....}
0cb0: 0a 09 09 09 72 65 74 75 72 6e 20 5b 5d 3b 0a 09  ....return [];..
0cc0: 09 7d 0a 0a 09 09 2f 2f 20 70 75 73 68 20 72 6f  .}....// push ro
0cd0: 63 6b 73 21 0a 09 09 54 75 70 6c 65 21 28 63 68  cks!...Tuple!(ch
0ce0: 61 72 2c 69 6e 74 29 5b 5d 20 74 72 79 43 28 29  ar,int)[] tryC()
0cf0: 20 7b 0a 09 09 09 63 6f 6e 73 74 28 50 6f 73 29   {....const(Pos)
0d00: 5b 5d 20 71 20 3d 20 5b 6f 5d 3b 0a 09 09 09 62  [] q = [o];....b
0d10: 6f 6f 6c 5b 5d 5b 5d 20 76 20 3d 20 6e 65 77 20  ool[][] v = new 
0d20: 62 6f 6f 6c 5b 5d 5b 5d 28 67 2e 6d 61 70 2e 48  bool[][](g.map.H
0d30: 2b 32 2c 20 67 2e 6d 61 70 2e 57 2b 32 29 3b 0a  +2, g.map.W+2);.
0d40: 09 09 09 76 5b 6f 2e 79 5d 5b 6f 2e 78 5d 3d 74  ...v[o.y][o.x]=t
0d50: 72 75 65 3b 0a 09 09 09 66 6f 72 28 69 6e 74 20  rue;....for(int 
0d60: 73 74 65 70 3d 33 30 3b 20 71 2e 6c 65 6e 67 74  step=30; q.lengt
0d70: 68 3b 20 2b 2b 73 74 65 70 29 20 7b 0a 09 09 09  h; ++step) {....
0d80: 09 50 6f 73 5b 5d 20 71 32 3b 0a 09 09 09 09 66  .Pos[] q2;.....f
0d90: 6f 72 65 61 63 68 28 70 3b 20 71 29 20 7b 0a 09  oreach(p; q) {..
0da0: 09 09 09 09 69 6e 74 5b 5d 20 64 79 3d 5b 2d 31  ....int[] dy=[-1
0db0: 2c 2b 31 2c 30 2c 30 5d 3b 0a 09 09 09 09 09 69  ,+1,0,0];......i
0dc0: 6e 74 5b 5d 20 64 78 3d 5b 30 2c 30 2c 2d 31 2c  nt[] dx=[0,0,-1,
0dd0: 2b 31 5d 3b 0a 09 09 09 09 09 66 6f 72 28 69 6e  +1];......for(in
0de0: 74 20 69 3d 30 3b 20 69 3c 34 3b 20 2b 2b 69 29  t i=0; i<4; ++i)
0df0: 20 7b 0a 09 09 09 09 09 09 69 6e 74 20 79 20 3d   {.......int y =
0e00: 20 70 2e 79 2b 64 79 5b 69 5d 3b 0a 09 09 09 09   p.y+dy[i];.....
0e10: 09 09 69 6e 74 20 78 20 3d 20 70 2e 78 2b 64 78  ..int x = p.x+dx
0e20: 5b 69 5d 3b 0a 09 09 09 09 09 09 69 66 28 76 5b  [i];.......if(v[
0e30: 79 5d 5b 78 5d 29 20 63 6f 6e 74 69 6e 75 65 3b  y][x]) continue;
0e40: 0a 09 09 09 09 09 09 69 66 28 79 3d 3d 73 2e 79  .......if(y==s.y
0e50: 20 26 26 20 78 3d 3d 73 2e 78 29 20 7b 0a 09 09   && x==s.x) {...
0e60: 09 09 09 09 09 63 68 61 72 20 63 20 3d 20 22 55  .....char c = "U
0e70: 44 52 4c 22 5b 69 5d 3b 0a 09 09 09 09 09 09 09  DRL"[i];........
0e80: 69 66 28 20 64 65 61 74 68 2e 63 6f 75 6e 74 28  if( death.count(
0e90: 63 29 20 3d 3d 20 30 20 29 0a 09 09 09 09 09 09  c) == 0 ).......
0ea0: 09 09 72 65 74 75 72 6e 20 5b 74 75 70 6c 65 28  ..return [tuple(
0eb0: 63 2c 73 74 65 70 29 5d 3b 0a 09 09 09 09 09 09  c,step)];.......
0ec0: 7d 20 65 6c 73 65 20 69 66 28 67 2e 6d 61 70 5b  } else if(g.map[
0ed0: 79 2c 78 5d 3d 3d 27 20 27 7c 7c 67 2e 6d 61 70  y,x]==' '||g.map
0ee0: 5b 79 2c 78 5d 3d 3d 27 5c 5c 27 7c 7c 67 2e 6d  [y,x]=='\\'||g.m
0ef0: 61 70 5b 79 2c 78 5d 3d 3d 27 2e 27 29 20 7b 0a  ap[y,x]=='.') {.
0f00: 09 09 09 09 09 09 09 71 32 20 7e 3d 20 6e 65 77  .......q2 ~= new
0f10: 20 50 6f 73 28 79 2c 78 29 3b 0a 09 09 09 09 09   Pos(y,x);......
0f20: 09 09 76 5b 79 5d 5b 78 5d 3d 74 72 75 65 3b 0a  ..v[y][x]=true;.
0f30: 09 09 09 09 09 09 7d 20 65 6c 73 65 20 69 66 28  ......} else if(
0f40: 64 79 5b 69 5d 3d 3d 30 20 26 26 20 67 2e 6d 61  dy[i]==0 && g.ma
0f50: 70 5b 70 5d 3d 3d 27 20 27 20 26 26 20 67 2e 6d  p[p]==' ' && g.m
0f60: 61 70 5b 79 2c 78 5d 3d 3d 27 2a 27 20 26 26 20  ap[y,x]=='*' && 
0f70: 28 67 2e 6d 61 70 5b 79 2b 64 79 5b 69 5d 2c 78  (g.map[y+dy[i],x
0f80: 2b 64 78 5b 69 5d 5d 3d 3d 27 20 27 7c 7c 67 2e  +dx[i]]==' '||g.
0f90: 6d 61 70 5b 79 2b 64 79 5b 69 5d 2c 78 2b 64 78  map[y+dy[i],x+dx
0fa0: 5b 69 5d 5d 3d 3d 27 52 27 29 29 20 7b 0a 09 09  [i]]=='R')) {...
0fb0: 09 09 09 09 09 71 32 20 7e 3d 20 6e 65 77 20 50  .....q2 ~= new P
0fc0: 6f 73 28 79 2c 78 29 3b 0a 09 09 09 09 09 09 09  os(y,x);........
0fd0: 76 5b 79 5d 5b 78 5d 3d 74 72 75 65 3b 0a 09 09  v[y][x]=true;...
0fe0: 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 09 09 09  ....}......}....
0ff0: 09 7d 0a 09 09 09 09 71 20 3d 20 71 32 3b 0a 09  .}.....q = q2;..
1000: 09 09 7d 0a 09 09 09 72 65 74 75 72 6e 20 5b 5d  ..}....return []
1010: 3b 0a 09 09 7d 0a 09 09 72 65 74 75 72 6e 20 74  ;...}...return t
1020: 72 79 41 28 29 20 7e 20 74 72 79 42 28 29 20 7e  ryA() ~ tryB() ~
1030: 20 74 72 79 43 28 29 20 7e 20 74 75 70 6c 65 28   tryC() ~ tuple(
1040: 27 57 27 2c 20 69 6e 74 2e 6d 61 78 29 3b 0a 09  'W', int.max);..
1050: 7d 0a 7d 0a                                      }.}.