Check-in [6e4c06b018]
Not logged in
Overview
SHA1 Hash:6e4c06b01887a43d7eea6e7b518fa246cd1330e3
Date: 2012-07-15 03:00:27
User: kinaba
Comment:Solver supports trampoline.
Timelines: family | ancestors | descendants | both | trunk
Diffs: redesign
Downloads: Tarball | ZIP archive
Other Links: files | file ages | manifest
Tags And Properties
Changes

Modified src/solver.d from [69c19d5fe197eaad] to [4aac390deb513002].

136 136 if(!danger(p.y,p.x)) 137 137 q ~= p; 138 138 bool[][] v = new bool[][](g.map.H+2, g.map.W+2); 139 139 foreach(p; q) v[p.y][p.x]=true; 140 140 for(int step=1; q.length; ++step) { 141 141 Pos[] q2; 142 142 foreach(p; q) { 143 - int[] dy=[-1,+1,0,0]; 144 - int[] dx=[0,0,-1,+1]; 145 - for(int i=0; i<4; ++i) { 146 - int y = p.y+dy[i]; 147 - int x = p.x+dx[i]; 143 + int[] yyy=[p.y-1,p.y+1,p.y,p.y]; 144 + int[] xxx=[p.x,p.x,p.x-1,p.x+1]; 145 + for(int i=0; i<yyy.length; ++i) { 146 + int y = yyy[i]; 147 + int x = xxx[i]; 148 + if('1'<=g.map[y,x]&&g.map[y,x]<='9') { 149 + foreach(ppp; g.map.tr_source[g.map[y,x]]) { 150 + yyy ~= ppp.y; 151 + xxx ~= ppp.x; 152 + } 153 + continue; 154 + } 148 155 if(v[y][x]) continue; 149 - if(y==s.y && x==s.x) { 156 + if(y==s.y && x==s.x && i<4) { 150 157 char c = "UDRL"[i]; 151 158 if( death.count(c) == 0 ) 152 159 return [tuple(c,step)]; 153 160 } else if(forbidden_cell[y][x]){ 154 - } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.') { 161 + } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.'||i>=4) { 155 162 if(danger(y,x)) 156 163 continue; 157 164 q2 ~= new Pos(y,x); 158 165 v[y][x]=true; 159 166 } 160 167 } 161 168 } ................................................................................ 169 176 const(Pos)[] q; 170 177 foreach(p; gs) q ~= p; 171 178 bool[][] v = new bool[][](g.map.H+2, g.map.W+2); 172 179 foreach(p; q) v[p.y][p.x]=true; 173 180 for(int step=10; q.length; ++step) { 174 181 Pos[] q2; 175 182 foreach(p; q) { 176 - int[] dy=[-1,+1,0,0]; 177 - int[] dx=[0,0,-1,+1]; 178 - for(int i=0; i<4; ++i) { 179 - int y = p.y+dy[i]; 180 - int x = p.x+dx[i]; 183 + int[] yyy=[p.y-1,p.y+1,p.y,p.y]; 184 + int[] xxx=[p.x,p.x,p.x-1,p.x+1]; 185 + for(int i=0; i<yyy.length; ++i) { 186 + int y = yyy[i]; 187 + int x = xxx[i]; 188 + if('1'<=g.map[y,x]&&g.map[y,x]<='9') { 189 + foreach(ppp; g.map.tr_source[g.map[y,x]]) { 190 + yyy ~= ppp.y; 191 + xxx ~= ppp.x; 192 + } 193 + continue; 194 + } 181 195 if(v[y][x]) continue; 182 - if(y==s.y && x==s.x) { 196 + if(y==s.y && x==s.x && i<4) { 183 197 char c = "UDRL"[i]; 184 198 if( death.count(c) == 0 ) 185 199 return [tuple(c,step)]; 186 200 } else if(forbidden_cell[y][x]){ 187 - } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.') { 201 + } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.'||i>=4) { 188 202 q2 ~= new Pos(y,x); 189 203 v[y][x]=true; 190 204 } 191 205 } 192 206 } 193 207 q = q2; 194 208 } ................................................................................ 200 214 const(Pos)[] q; 201 215 foreach(p; gs) q ~= p; 202 216 bool[][] v = new bool[][](g.map.H+2, g.map.W+2); 203 217 foreach(p; q) v[p.y][p.x]=true; 204 218 for(int step=20; q.length; ++step) { 205 219 Pos[] q2; 206 220 foreach(p; q) { 207 - int[] dy=[-1,+1,0,0]; 208 - int[] dx=[0,0,-1,+1]; 209 - for(int i=0; i<4; ++i) { 210 - int y = p.y+dy[i]; 211 - int x = p.x+dx[i]; 221 + int[] yyy=[p.y-1,p.y+1,p.y,p.y]; 222 + int[] xxx=[p.x,p.x,p.x-1,p.x+1]; 223 + for(int i=0; i<yyy.length; ++i) { 224 + int y = yyy[i]; 225 + int x = xxx[i]; 226 + if('1'<=g.map[y,x]&&g.map[y,x]<='9') { 227 + foreach(ppp; g.map.tr_source[g.map[y,x]]) { 228 + yyy ~= ppp.y; 229 + xxx ~= ppp.x; 230 + } 231 + continue; 232 + } 212 233 if(v[y][x]) continue; 213 - if(y==s.y && x==s.x) { 234 + if(y==s.y && x==s.x && i<4) { 214 235 char c = "UDRL"[i]; 215 236 if( death.count(c) == 0 ) 216 237 return [tuple(c,step)]; 217 238 } else if(forbidden_cell[y][x]){ 218 - } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.') { 239 + } else if(g.map[y,x]==' '||g.map[y,x]=='\\'||g.map[y,x]=='.'||i>=4) { 219 240 q2 ~= new Pos(y,x); 220 241 v[y][x]=true; 221 - } else if(dy[i]==0 && g.map[p]==' ' && g.map[y,x]=='*' && (g.map[y+dy[i],x+dx[i]]==' '||g.map[y+dy[i],x+dx[i]]=='R')) { 242 + } else if(i<4 && (y-p.y)==0 && g.map[p]==' ' && g.map[y,x]=='*' && (g.map[y+(y-p.y),x+(x-p.x)]==' '||g.map[y+(y-p.y),x+(x-p.x)]=='R')) { 222 243 q2 ~= new Pos(y,x); 223 244 v[y][x]=true; 224 245 } 225 246 } 226 247 } 227 248 q = q2; 228 249 }