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 185 for(int x=0; x<W; ++x)
186 186 if(data[y][x]=='R')
187 187 sy=y, sx=x;
188 188 else if(data[y][x]=='\\')
189 189 ly~=y, lx~=x;
190 190 else if(data[y][x]=='O')
191 191 oy=y, ox=x;
192 - if(ly.length==0)
193 - return goal(sy,sx,oy,ox);
192 + if(ly.length==0) {
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 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 207 alias Tuple!(int,"y",int,"x") Pt;
199 208 Pt[] q = [Pt(oy,ox)];
200 - while(q.length) {
209 + for(int step=1; q.length; ++step) {
201 210 Pt[] q2;
202 211 foreach(p; q) {
203 212
204 213 int[] dy=[-1,+1,0,0];
205 214 int[] dx=[0,0,-1,+1];
206 215 for(int i=0; i<4; ++i) {
207 216 int y = p.y+dy[i];
208 217 int x = p.x+dx[i];
209 218 if(y==sy && x==sx) {
210 - if(i==0) return command_D();
211 - if(i==1) return command_U();
212 - if(i==2) return command_R();
213 - if(i==3) return command_L();
214 - } else if(data[y][x]==' ') {
219 + if(i==0) return tuple('D',step);
220 + if(i==1) return tuple('U',step);
221 + if(i==2) return tuple('R',step);
222 + if(i==3) return tuple('L',step);
223 + } else if(data[y][x]==' '||data[y][x]=='\\') {
215 224 q2 ~= Pt(y,x);
216 225 } else if(data[y][x]=='.' && data[y-1][x]!='*') {
217 226 q2 ~= Pt(y,x);
218 227 }
219 228 }
220 229 }
221 230 q = q2;
222 231 }
223 232 q = [Pt(oy,ox)];
224 - while(q.length) {
233 + for(int step=1<<10; q.length; ++step) {
225 234 Pt[] q2;
226 235 foreach(p; q) {
227 236
228 237 int[] dy=[-1,+1,0,0];
229 238 int[] dx=[0,0,-1,+1];
230 239 for(int i=0; i<4; ++i) {
231 240 int y = p.y+dy[i];
232 241 int x = p.x+dx[i];
233 242 if(y==sy && x==sx) {
234 - if(i==0) return command_D();
235 - if(i==1) return command_U();
236 - if(i==2) return command_R();
237 - if(i==3) return command_L();
238 - } else if(data[y][x]==' ') {
243 + if(i==0) return tuple('D',step);
244 + if(i==1) return tuple('U',step);
245 + if(i==2) return tuple('R',step);
246 + if(i==3) return tuple('L',step);
247 + } else if(data[y][x]==' '||data[y][x]=='\\') {
239 248 q2 ~= Pt(y,x);
240 249 } else if(data[y][x]=='.'/* && data[y-1][x]!='*'*/) {
241 250 q2 ~= Pt(y,x);
242 251 }
243 252 }
244 253 }
245 254 q = q2;
246 255 }
247 - return abort();
256 + return tuple('A',int.max);
248 257 }
249 258 }
250 259
251 260 class MyForm : Form
252 261 {
253 262 Map m;
254 263 int score;