ADDED   solver.d
Index: solver.d
==================================================================
--- solver.d
+++ solver.d
@@ -0,0 +1,104 @@
+import util;
+import game;
+import output;
+
+int g_wc = 0;
+
+void act(Game g)
+{
+	Pos   ro = g.map.robot;
+	Pos[] la = g.map.lambdas();
+	Pos   li = g.map.lift;
+
+	char c = 'W';
+	if( la.empty ) {
+		auto r = search(g, ro, li);
+		c = r[0];
+	} else {
+		Tuple!(char,int)[] cand;
+		foreach(lam; la)
+			cand ~= search(g, ro, lam);
+		sort!((Tuple!(char,int) c1, Tuple!(char,int) c2){
+			if(c1[1] != c2[1])
+				return c1[1] < c2[1];
+			return c1[0] < c2[0];
+		})(cand);
+		c = cand[0][0];
+	}
+	if(c=='W') {
+		g_wc++;
+		if(g_wc > 10)
+			c = 'A';
+	}
+	else
+		g_wc = 0;
+	g.command(c);
+}
+
+Tuple!(char,int) search(Game g, Pos s, Pos o)
+{
+	Pos[] q = [o];
+	bool[][] v = new bool[][](g.map.H+2, g.map.W+2);
+	for(int step=1; q.length; ++step) {
+		Pos[] q2;
+		foreach(p; q) {
+			int[] dy=[-1,+1,0,0];
+			int[] dx=[0,0,-1,+1];
+			for(int i=0; i<4; ++i) {
+				int y = p.y+dy[i];
+				int x = p.x+dx[i];
+				if(v[y][x]) continue;
+				if(y==s.y && x==s.x) {
+					if(i==0) return tuple('U',step);
+					if(i==1) return tuple('D',step);
+					if(i==2) return tuple('R',step);
+					if(i==3) return tuple('L',step);
+				} else if(g.map[y,x]==' '||g.map[y,x]=='\\') {
+					q2 ~= new Pos(y,x);
+					v[y][x]=true;
+				} else if(g.map[y,x]=='.' && g.map[y-1,x]!='*') {
+					q2 ~= new Pos(y,x);
+					v[y][x]=true;
+				}
+			}
+		}
+		q = q2;
+	}
+	q = [o];
+	v = new bool[][](g.map.H+2, g.map.W+2);
+	for(int step=1000; q.length; ++step) {
+		Pos[] q2;
+		foreach(p; q) {
+			int[] dy=[-1,+1,0,0];
+			int[] dx=[0,0,-1,+1];
+			for(int i=0; i<4; ++i) {
+				int y = p.y+dy[i];
+				int x = p.x+dx[i];
+				if(v[y][x]) continue;
+				if(y==s.y && x==s.x) {
+					if(i==0) return tuple('U',step);
+					if(i==1) return tuple('D',step);
+					if(i==2) return tuple('R',step);
+					if(i==3) return tuple('L',step);
+				} else if(g.map[y,x]==' '||g.map[y,x]=='\\') {
+					q2 ~= new Pos(y,x);
+					v[y][x]=true;
+				} else if(g.map[y,x]=='.'/* && g[y-1,x]!='*'*/) {
+					q2 ~= new Pos(y,x);
+					v[y][x]=true;
+				}
+			}
+		}
+		q = q2;
+	}
+	return tuple('W', int.max);
+}
+
+void main(string[] args)
+{
+	auto g = Game.load(File(args[1]));
+	g.set_output(new GuardedOutput(g));
+
+	while(!g.dead && !g.cleared)
+		act(g);
+}