Diff
Not logged in

Differences From Artifact [ede3d182d99f2de5]:

To Artifact [dca9b6f10b63ba61]:


293 } 293 } 294 return []; 294 return []; 295 } 295 } 296 return (danger_ok ? [] : tryA()) ~ tryB() ~ tryC(); 296 return (danger_ok ? [] : tryA()) ~ tryB() ~ tryC(); 297 } 297 } 298 } 298 } 299 299 > 300 class Solver_2(Solver) > 301 { > 302 string plan; > 303 > 304 Game g; > 305 this(in Game g) > 306 { > 307 this.g = g.clone(); > 308 make_plan(g); > 309 } > 310 > 311 Tuple!(Solver,string) run_sub_solver(in Game g) > 312 { > 313 string log; > 314 auto s = new Solver(g); > 315 while(!g.cleared && !g.dead && plan.length<=g.map.H*g.map.W) { > 316 char c = s.single_step(); > 317 if( c == 'A' ) > 318 break; > 319 log ~= c; > 320 } > 321 while(log.length>0 && log[$-1]=='W') > 322 log.length--; > 323 return tuple(s, log); > 324 } > 325 > 326 void make_plan(in Game g) { > 327 Tuple!(Solver,string) x = run_sub_solver(g); > 328 plan = x[1]; > 329 if(x[0].g.cleared) > 330 return; > 331 modify_plan(g, x[0].g.score); > 332 } > 333 > 334 void modify_plan(in Game ini, long unmod) > 335 { > 336 int bp = max(0, (cast(int)plan.length)-10); > 337 Game g = ini.clone(); > 338 for(int i=0; i<bp; ++i) g.command(plan[i]); > 339 > 340 Tuple!(string,long) cand = tuple(plan, unmod); > 341 for(int i=bp; i<plan.length; ++i) { > 342 foreach(char c; "UDLR") > 343 if(c != plan[i]) { > 344 Tuple!(string,long) zz = try_plan(c, g); > 345 if(cand[1]<zz[1]) > 346 cand = tuple(plan[0..i]~c~zz[0], > 347 } > 348 g.command(plan[i]); > 349 } > 350 plan = cand[0]; > 351 } > 352 > 353 Tuple!(string,long) try_plan(char c, in Game g) > 354 { > 355 Game gg = g.clone(); > 356 gg.command(c); > 357 Tuple!(Solver, string) x = run_sub_solver(gg); > 358 return tuple(x[1], x[0].g.score); > 359 } > 360 > 361 char single_step() { > 362 if(plan.empty) > 363 return 'A'; > 364 char c = plan[0]; > 365 plan = plan[1..$]; > 366 g.command(c); > 367 return c; > 368 } > 369 > 370 void force(char c) { > 371 g.command(c); > 372 make_plan(g); > 373 } > 374 } > 375 300 alias Solver_1 MainSolver; | 376 alias Solver_2!(Solver_1) MainSolver;