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 }.}.