Differences From Artifact [8291f785bb7f35e6]:
- File
test.d
- 2012-07-14 02:29:29 - part of checkin [4bdb07bffb] on branch trunk - auto go-home. (user: kinaba) [annotate]
To Artifact [2d52631f9ee4aac8]:
- File
test.d
- 2012-07-14 02:34:47 - part of checkin [8c5c274847] on branch trunk - Auto go home generalized. (user: kinaba) [annotate]
185 for(int x=0; x<W; ++x) 185 for(int x=0; x<W; ++x)
186 if(data[y][x]=='R') 186 if(data[y][x]=='R')
187 sy=y, sx=x; 187 sy=y, sx=x;
188 else if(data[y][x]=='\\') 188 else if(data[y][x]=='\\')
189 ly~=y, lx~=x; 189 ly~=y, lx~=x;
190 else if(data[y][x]=='O') 190 else if(data[y][x]=='O')
191 oy=y, ox=x; 191 oy=y, ox=x;
192 if(ly.length==0) | 192 if(ly.length==0) {
193 return goal(sy,sx,oy,ox); | 193 auto r = search(sy,sx,oy,ox);
> 194 switch(r[0]) {
> 195 case 'D': return command_D();
> 196 case 'U': return command_U();
> 197 case 'L': return command_L();
> 198 case 'R': return command_R();
> 199 case 'A': return abort();
> 200 default: return wait();
> 201 }
> 202 }
194 return wait(); 203 return wait();
195 } 204 }
196 int goal(int sy, int sx, int oy, int ox) | 205 Tuple!(char,int) search(int sy, int sx, int oy, int ox)
197 { 206 {
198 alias Tuple!(int,"y",int,"x") Pt; 207 alias Tuple!(int,"y",int,"x") Pt;
199 Pt[] q = [Pt(oy,ox)]; 208 Pt[] q = [Pt(oy,ox)];
200 while(q.length) { | 209 for(int step=1; q.length; ++step) {
201 Pt[] q2; 210 Pt[] q2;
202 foreach(p; q) { 211 foreach(p; q) {
203 212
204 int[] dy=[-1,+1,0,0]; 213 int[] dy=[-1,+1,0,0];
205 int[] dx=[0,0,-1,+1]; 214 int[] dx=[0,0,-1,+1];
206 for(int i=0; i<4; ++i) { 215 for(int i=0; i<4; ++i) {
207 int y = p.y+dy[i]; 216 int y = p.y+dy[i];
208 int x = p.x+dx[i]; 217 int x = p.x+dx[i];
209 if(y==sy && x==sx) { 218 if(y==sy && x==sx) {
210 if(i==0) return command_D(); | 219 if(i==0) return tuple('D',step);
211 if(i==1) return command_U(); | 220 if(i==1) return tuple('U',step);
212 if(i==2) return command_R(); | 221 if(i==2) return tuple('R',step);
213 if(i==3) return command_L(); | 222 if(i==3) return tuple('L',step);
214 } else if(data[y][x]==' ') { | 223 } else if(data[y][x]==' '||data[y][x]=='
215 q2 ~= Pt(y,x); 224 q2 ~= Pt(y,x);
216 } else if(data[y][x]=='.' && data[y-1][x 225 } else if(data[y][x]=='.' && data[y-1][x
217 q2 ~= Pt(y,x); 226 q2 ~= Pt(y,x);
218 } 227 }
219 } 228 }
220 } 229 }
221 q = q2; 230 q = q2;
222 } 231 }
223 q = [Pt(oy,ox)]; 232 q = [Pt(oy,ox)];
224 while(q.length) { | 233 for(int step=1<<10; q.length; ++step) {
225 Pt[] q2; 234 Pt[] q2;
226 foreach(p; q) { 235 foreach(p; q) {
227 236
228 int[] dy=[-1,+1,0,0]; 237 int[] dy=[-1,+1,0,0];
229 int[] dx=[0,0,-1,+1]; 238 int[] dx=[0,0,-1,+1];
230 for(int i=0; i<4; ++i) { 239 for(int i=0; i<4; ++i) {
231 int y = p.y+dy[i]; 240 int y = p.y+dy[i];
232 int x = p.x+dx[i]; 241 int x = p.x+dx[i];
233 if(y==sy && x==sx) { 242 if(y==sy && x==sx) {
234 if(i==0) return command_D(); | 243 if(i==0) return tuple('D',step);
235 if(i==1) return command_U(); | 244 if(i==1) return tuple('U',step);
236 if(i==2) return command_R(); | 245 if(i==2) return tuple('R',step);
237 if(i==3) return command_L(); | 246 if(i==3) return tuple('L',step);
238 } else if(data[y][x]==' ') { | 247 } else if(data[y][x]==' '||data[y][x]=='
239 q2 ~= Pt(y,x); 248 q2 ~= Pt(y,x);
240 } else if(data[y][x]=='.'/* && data[y-1] 249 } else if(data[y][x]=='.'/* && data[y-1]
241 q2 ~= Pt(y,x); 250 q2 ~= Pt(y,x);
242 } 251 }
243 } 252 }
244 } 253 }
245 q = q2; 254 q = q2;
246 } 255 }
247 return abort(); | 256 return tuple('A',int.max);
248 } 257 }
249 } 258 }
250 259
251 class MyForm : Form 260 class MyForm : Form
252 { 261 {
253 Map m; 262 Map m;
254 int score; 263 int score;