Check-in [52e6fbcc8d]
Not logged in
Overview
SHA1 Hash:52e6fbcc8d3672360f4b851eb5e78088e17e97ef
Date: 2012-07-14 17:58:14
User: kinaba
Comment:Add solver.d!!!
Timelines: family | ancestors | descendants | both | trunk
Diffs: redesign
Downloads: Tarball | ZIP archive
Other Links: files | file ages | manifest
Tags And Properties
Changes

Added solver.d version [2d4705e7ff103283]

> 1 import util; > 2 import game; > 3 import output; > 4 > 5 int g_wc = 0; > 6 > 7 void act(Game g) > 8 { > 9 Pos ro = g.map.robot; > 10 Pos[] la = g.map.lambdas(); > 11 Pos li = g.map.lift; > 12 > 13 char c = 'W'; > 14 if( la.empty ) { > 15 auto r = search(g, ro, li); > 16 c = r[0]; > 17 } else { > 18 Tuple!(char,int)[] cand; > 19 foreach(lam; la) > 20 cand ~= search(g, ro, lam); > 21 sort!((Tuple!(char,int) c1, Tuple!(char,int) c2){ > 22 if(c1[1] != c2[1]) > 23 return c1[1] < c2[1]; > 24 return c1[0] < c2[0]; > 25 })(cand); > 26 c = cand[0][0]; > 27 } > 28 if(c=='W') { > 29 g_wc++; > 30 if(g_wc > 10) > 31 c = 'A'; > 32 } > 33 else > 34 g_wc = 0; > 35 g.command(c); > 36 } > 37 > 38 Tuple!(char,int) search(Game g, Pos s, Pos o) > 39 { > 40 Pos[] q = [o]; > 41 bool[][] v = new bool[][](g.map.H+2, g.map.W+2); > 42 for(int step=1; q.length; ++step) { > 43 Pos[] q2; > 44 foreach(p; q) { > 45 int[] dy=[-1,+1,0,0]; > 46 int[] dx=[0,0,-1,+1]; > 47 for(int i=0; i<4; ++i) { > 48 int y = p.y+dy[i]; > 49 int x = p.x+dx[i]; > 50 if(v[y][x]) continue; > 51 if(y==s.y && x==s.x) { > 52 if(i==0) return tuple('U',step); > 53 if(i==1) return tuple('D',step); > 54 if(i==2) return tuple('R',step); > 55 if(i==3) return tuple('L',step); > 56 } else if(g.map[y,x]==' '||g.map[y,x]=='\\') { > 57 q2 ~= new Pos(y,x); > 58 v[y][x]=true; > 59 } else if(g.map[y,x]=='.' && g.map[y-1,x]!='*') > 60 q2 ~= new Pos(y,x); > 61 v[y][x]=true; > 62 } > 63 } > 64 } > 65 q = q2; > 66 } > 67 q = [o]; > 68 v = new bool[][](g.map.H+2, g.map.W+2); > 69 for(int step=1000; q.length; ++step) { > 70 Pos[] q2; > 71 foreach(p; q) { > 72 int[] dy=[-1,+1,0,0]; > 73 int[] dx=[0,0,-1,+1]; > 74 for(int i=0; i<4; ++i) { > 75 int y = p.y+dy[i]; > 76 int x = p.x+dx[i]; > 77 if(v[y][x]) continue; > 78 if(y==s.y && x==s.x) { > 79 if(i==0) return tuple('U',step); > 80 if(i==1) return tuple('D',step); > 81 if(i==2) return tuple('R',step); > 82 if(i==3) return tuple('L',step); > 83 } else if(g.map[y,x]==' '||g.map[y,x]=='\\') { > 84 q2 ~= new Pos(y,x); > 85 v[y][x]=true; > 86 } else if(g.map[y,x]=='.'/* && g[y-1,x]!='*'*/) > 87 q2 ~= new Pos(y,x); > 88 v[y][x]=true; > 89 } > 90 } > 91 } > 92 q = q2; > 93 } > 94 return tuple('W', int.max); > 95 } > 96 > 97 void main(string[] args) > 98 { > 99 auto g = Game.load(File(args[1])); > 100 g.set_output(new GuardedOutput(g)); > 101 > 102 while(!g.dead && !g.cleared) > 103 act(g); > 104 }