Index: test.d ================================================================== --- test.d +++ test.d @@ -1,10 +1,11 @@ import std.algorithm; import std.array; import std.conv; import std.stdio; import std.string; +import std.typecons; import dfl.all; class Map { private char[][] data; @@ -192,11 +193,60 @@ return goal(sy,sx,oy,ox); return wait(); } int goal(int sy, int sx, int oy, int ox) { - return wait(); + alias Tuple!(int,"y",int,"x") Pt; + Pt[] q = [Pt(oy,ox)]; + while(q.length) { + Pt[] 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(y==sy && x==sx) { + if(i==0) return command_D(); + if(i==1) return command_U(); + if(i==2) return command_R(); + if(i==3) return command_L(); + } else if(data[y][x]==' ') { + q2 ~= Pt(y,x); + } else if(data[y][x]=='.' && data[y-1][x]!='*') { + q2 ~= Pt(y,x); + } + } + } + q = q2; + } + q = [Pt(oy,ox)]; + while(q.length) { + Pt[] 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(y==sy && x==sx) { + if(i==0) return command_D(); + if(i==1) return command_U(); + if(i==2) return command_R(); + if(i==3) return command_L(); + } else if(data[y][x]==' ') { + q2 ~= Pt(y,x); + } else if(data[y][x]=='.'/* && data[y-1][x]!='*'*/) { + q2 ~= Pt(y,x); + } + } + } + q = q2; + } + return abort(); } } class MyForm : Form {