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