-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPathFinder#2.BFS.js
More file actions
269 lines (248 loc) · 13 KB
/
PathFinder#2.BFS.js
File metadata and controls
269 lines (248 loc) · 13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
// https://www.codewars.com/kata/57658bfa28ed87ecfa00058a/solutions/javascript
function pathFinder(input) {
console.log(input);
const wall = 'W';
const maze = input.split('\n').map(s => s.split(''));
const accessed = input.split('\n').map(s => s.split('').fill(false));
const width = maze[0].length;
const height = maze.length;
let count = 0;
const step = findExitWithBfs();
console.log("\n", { count });
return step != -1 ? step : false;
function findExitWithBfs() {
const directions = [[1, 0], [0, 1], [-1, 0], [0, -1]];
const queue = [{
position: [0, 0],
step: 0
}];
while (queue.length > 0) {
count++;
const first = queue.shift();
const { position: [x, y], step } = first;
accessed[y][x] = true;
if (x == width - 1 && y == height - 1) {
return step;
}
else {
for (let index = 0; index < directions.length; index++) {
const [xOffset, yOffset] = directions[index];
const nextX = x + xOffset;
const nextY = y + yOffset;
if (nextX >= 0 && nextY >= 0 && nextX < width && nextY < height && maze[nextY][nextX] != wall && !accessed[nextY][nextX]) {
if (-1 == queue.findIndex(({ position: [x, y], _ }) => x == nextX && y == nextY)) {
queue.push({
position: [nextX, nextY],
step: step + 1
});
}
}
}
}
}
return -1;
}
}
function logMaze(maze) {
const str = maze.map(a => a.join(' ')).join('\n');
console.log('maze:');
console.log(str);
}
function test(input) {
// input.shift();
// input = input.replace("\r\n\r\n",'');
input = input.replace(/^\n/, '');
console.time();
// const result = input;
const result = pathFinder(input);
console.timeEnd();
console.log({ result });
}
input1 = `
.W.
.W.
...`;
input2 = `
.W.
.W.
W..`;
input3 = `
......
......
......
......
......
......`;
input4 =
`......
......
......
......
.....W
....W.`;
//10
input5 =
`.....W
......
W..WWW
..W.W.
......
.W.W..`;
//16
input6 =
`.......WW
.W.W..W..
......W.W
...W....W
.W....W..
WW......W
..W..W.W.
..W......
.W..W..W.`;
bigMaze = `
..W..........W..W...W.W.W...W.W.W........W.W...W............W..W.WW.W.W......W.......W.......WW...W.
.....W..W........WWWWW.W..WWW.......W....W...W...W..W...W.W.....W.......W.W.W..W...W.WW..W...W.....W
........W..W........W..W.WW......W....WW..WW...........W.W..................W.W.W....W....W..W.W...W
..W.WW.....WW..W...WWW.W..W..W..W.....W.............W...W....W...W......W..WW....WW..W..W.........WW
.W.WW.....W..W..W......W......WWW...W...............W..W.....W.W..W...W..W..W...W.........W......W.W
W......WW...............WW.WW..W...W.WW....WWW...W..W....W.W.W......W..........W...W....W......W.W..
WW.W.....W.WW.........WW.....W...........W.....W.....W.....W.WW.......W.....W....WW.....WW.WW.....WW
.WWW.....W.W.......W....W.W..W....W....WW..WW........W.WW.....W.WWW.......W..W............W......W..
....W...W.W.....W........W..WWWW..............W.W....WW...WW..WWW.WW..W...W........W......W...W..WWW
..W.....W.W............W.....W..WW.....W..W.....W.W.WW....W......W.W...WW.W...WW..W.W.W.W.....W.W...
W..W.WW..W.W...WW.WW.............W..WW...W...W.WW.W........W.W.W...W......W......W..W.........WW....
.W......WWW.W.....W...W...........W..WWW...WW.........WWWW...W..W.WW.WW..........WW........W.WW.W..W
..W.W....W....WWW.WW.W..WW.W..W.....W..WW..W......W..W......WWWWWW.....W.......W..W.......W.........
.W..W......WW...W.....W..W.......W...W...WW...W.W...W.....WWW.......W..W.W..WW...W.W..W.W.....W..W..
W......WW.........W...WW...W..W...WWW....W........WW.....W.......W.WW..W.....WW...W.........W.WW....
..W.....W.W...WW.W..WWW.W..W.W..W........W.W..WW..W.W.................W.WW..WWWW..WW...W..W.W..W.W.W
...W.W..........WW..WWW.......W........W.......WW.WW.W..WW..W............W...W..W......W.WW...WWW.W.
.....W...........W..W.WWWW.WW........W.W...W.WWWW.WW....W.........W.W.......W.....W.W.WW....W....WWW
.WW.WW.WWW.....W....W....W.W..........WW..W..W..W.W.........W..WW..WW..W.W.W....W.W..W.W...W.WWW....
....WWWWW.....WWW..W....WW..W..W.....WWW....WW...W....W...W...W.W.......W......W......W.W...W.WW.W..
.....WW..W.WWWWW....W.W...........WW.WW..W.....W.W..WW.W.........W.W....WWW....W..........WWW..W....
W............WW......W.W.W......WW..W..W.W.............W...WW......W.....W.W.W..W..W..WW.W.WWW.WW..W
W........WW..............W.WW.W.W..WWWWW......W.........W..W...W....W....WW..........W...WW.....W..W
.......W....WW..W.W....W.......WW.......W....W........W.......W....W..W....W.W.W.W.WW..WW...........
WWWWW.......W.W.....W.W..............WW......WWW..WW....WW....W.W..W.....W.......WW.W......W.W...W..
..W.W..W.WW.W.W..WW...W.WWW..W..W....W...WWW.WW....W..W....W...W..WW...WW.....W.....W.W........W....
WW........................W.W..W..W...W.W...WW.......W.W.....W..WW..WW.WW...W..WW.WWWW.W...WW.W.....
W..W....W...WWW.W...WW..............W..WWW.W.WW.WW....W....WW.W....W..W...W.WWW..W.WW.......W.W..W..
.WW..WW...W.W....W....W..W.W.W.....W....W..WW.W........WW.W.....WWWWW.W..W.W..W.....W........W......
..WW..WW.W.W..W....WW.WWW.....W..WW.....W.WW.W........W.......WW..W...W..WWW...W..W..W..W..W...WW...
....WW...W....W.......................W....W.W.WW.W......W.W.....WW.W...........W..W.W...WWW.....WW.
.W.....WWW......W.W....W..W...............W.........W.....WWW.......WW....W..W.W.....W.W.W..WWW.....
W..........WWW....WW..........W........W...W....W.W.W....WW...WW.W....WW........W.WWW.....W..W.W....
.W.W.WW..W.W..W.W......W.W.......W.W.W..W.WW........W........W.WW..WW..W............W.W..W....WW.WW.
.W.W.W......W..W.......W....W......W...W...WW...........W....W.........W..WWW.W...W.WW......W..W....
...W.W...W............WW......W........W..W.....WW.WW..W....W.W.W.......WW.......W.......WW.........
...W.....WW.WWWW..WWW.WW....W..W.W.....W....W.WW....W...W..WW..W.W..W....WW....W....W..WW..W.W.W..W.
WWW...WW..W..................W...W.W.W.......W.....WW..............WWW....W...W.W................W..
..WWW......WW..W.....W..W......WW.WW.....WW....W..WWW..WW...W...W.....W......W.W...WW......W....W...
...W..W.W......W..W......W.W.WW...W.W..WW...W...W.WW.W.WW...W.....W.....W....W.............W.....W..
.W.WWW........WW.WW.W..W.W..W.WWW.........W....W.W......WW......WW..W.......W..WW.W......W...W....WW
.W......W.W.WW.WW....W......W..W.W........W...WW.W..................W.W.....W.W.W.W.W.WW.W..W..W.WW.
......WWW...W..W..W.W...W..WWW.W...W..W.....WW...W..W.....W...WW..........W..W...WWW.WWW............
...WWWWW....W...WWW.WW...W..............W......W...W....W......W...W..W....WW...WW.W...W......W.....
......W..W..WW.WW.W.W.....W.....WW........W......WW..WW..WW.....WW.W..W....WW....W........WW.W..WW.W
..WW..W..W......W.W.WW.WWW.......W..W..W..W.W...W..........W.W.W...W...WW.W....WW.W.WW..W.......W.W.
W.....W.......W..W...WWW...WWWW........WWW..W.W.W.W...........W.W......W.............W........W...W.
W.W.WW.W........WW..W.........W....W...W..W.W.......W.W..W.W..W..W..W..W..W..WWW.W..WW..WW.W..W.....
..W...WW..W..WW..WW..WWWWW.....W..WWW....W......WW.W.........WWWW....W...W......W.W..W...WW....WW...
...WW............W.WW..W.WW.....WW.WW.W..W......W.WW...W............W.W.W..W.......WWW.W.WW...WW....
.....W.....W....W.W..WW.....WW......W....W..WWW...W........W.W....WW......WW.WW...WW.....W...WW...W.
WW..W.W.WWW..W.WW..WW.W.WW.W..W..W..W.WWW.......WW.....WW......W...W.W....W......WW.W......WW...W...
W..W.W.WW......WWWWW..W....WW.....WW.WWWW.....WW...W..WWW..W...W.WW..W..WW..WW..............W.......
..W....W..WWWWW.W...WWW.....W.W...........W.WW.......W...W.W.W.......W.WWW.W.W..W....W.......W.W..W.
...WWW..W...WWW.W....WW..W......W.W.........W....WW.W.............W..W..WWWW.W..W..W.....W...W..W...
WW........W.........W......W....W.WW.....WW.W...W..WWW...W...W..W.W.W..W...W.W..W........W...W.....W
.W....WW..W...W....WWWWW.....W.....WW.....W.....W..W.........W.W........W....W...WW...WW......W.....
.WW.W.....W....WW.W..W.......WW...W.....W....W..W.W...WW....W..W.W.....W...W......W.......W...W..W..
..WW.W.....W....W.W..........W.W...WWW.W..W.WWWW....W...W..W.......WW...W....W...W..W..WWW.........W
W..W.....W.W..W.W..W....W..................W......W.......W.W......W..W....W....WW.....W.W...WW....W
..W..W.W.........W...WWW...........W.........W...WW.W...WW...W.W.W...WW............W.WW...W.W.W...WW
...W..............W......W........W.W.....W.W....W...W...WW...W.W..W....WWW.....W..W..W..........W..
...WW.WW...W...W.W..W.....WWW.W.W.W.WW....W.W.W.W.W.W......WWW..W.........WW...W..W...WW..W.W...WW..
..WWW.WWW...W.W.W......W............W.......W.W...WWWW.....W..........W...W..W..W....WW......W.....W
..W...W....W..W...W.......W.W...W..WW..W......W.....W...WW.W.......W.W..W...W..W....W..WW....W......
..W...W..W......W...W..WWWWW...W.W.WW.W.W..W..W.......W...WW....W...W.WW.W.W......W.W....W.W..W.W...
WW...W..W..WW.W....W.WW....W...WW....WW.W..W..W.W...........WW...W.......WW.W...WW.W.W......W......W
.W......W..W...W..W.....W......W.W..W.W.....W.W....W....W.......W.W.W.........WW.....W.W.........W.W
W..........WWW...W..W..W.W....W.........WWW..WW..W..WW...WW..WW..WW..W.....W..W..WWW.....W.W..W....W
.........W.W.........W.....W.........W......WWW..W......W....WW..WW..W....W.W.....WW.W.W..WWW..W...W
.W.....W.W...W.W..W.W.W....W.............WW...W...W........WW....W..WW...WW.WWW.....WW.....W..W.W..W
...W.....W.W.W.W.W...W..WW..W.....W..WW.W.W.W.....W......W........W.WW.....WW.W.......WW.WW.....W...
....WWW....WW.......W....W...........WW....W.......WWW.....WW...W.............W.W..W......WWW.....W.
.W.W........W...................WWW...........W.W.....W..W..W.W...WW......WW.......WWW.WW.WW.W.WWW..
..W........W......W..WWWW.W......W.W.........W...........W.....W.......W.W....W.....WW.WW....W......
.W..W....W..W...W.W.WWW..W.W..WW......W......WWWW......W.W....W..W........W..W..WWWW.W...WW.W...WW.W
.....W...W.......WW.W....W.W.WW....WW.........W...W......W.W.W.W..W............W.W..W..W......W.....
.WW.W....W..W.W.W............W....W....W...........W.....WWW.WW.....WWWWW..........WW..WW.W......W.W
WW.......W...W..W.W..W.W...W.WWW...W.W........W.W...W...W.WW.WWWWW.....W.......W.W.......WW....WW...
W...W.......W....W.W....W.W..WW.W..W.......W...W..WWW.W......WWWWW..WWWW....WWWW.....WWW.WW.W.W.....
....W.....WW.W.......W..........W.W..WWW.W...W...W...W..W.....WWWW........W...W.....WWWWW..W.......W
....W...W........WWW.WW..WWW.W..W...WW....W..WWW.WW.W....WW.....WWW..WW....W.WW...W....W.W.WWW...WW.
.W.WW.....W...W..W......W.W....W..W......W...WW........W.W...W...W...WW......................W...W..
.......W.WW.WW..W....W.WW..W.W..W.......W....W.....W...........WW....W..W.W..W....W.W.WWW....W...W..
...WW...WW.....W...WW..W.W..W.....W......W....W...W......WW.W.......WWW.W.WW.......WW........W.W....
W.W.W..W........WW..............W........W........W..W.....W.....WW.W.W...WW....W....W....W....W....
.............WW....W.W.......WWW..............W......W.......W..WW.................WWW.W.....W....W.
.WW.......W...W.WW....W...WWW..WWW.WW..W..........WWW...W......WWW..WWWWW..W.W....W...W..W.....W....
.W.....W.....W..WWWW..W....W......WWW.....W..........W.W..W...W......WW..WWW.W....WWW...W....WWW....
.WWWW.W...W.W.W.........W.....WW..W.W..W..W...W.W.W...W........WW....W..WWWW.W....WW.....W..W.....W.
W..W....W.WW..WW....W.WW.W.W....W.W...W......W.WW.......WW.W...WW...W...W.WW.........WW....WW..W..WW
W.......WW..W...WWW.WW...........W.WW.W....W.W.....WW..WWWWW....W....W.W...W.W.W.W.W..W.....W.W...W.
.WW...WW.W.......WWW...W...W......WW..W.....W.W.....W...WW....W...W.W...W..W.WW.W.W..W....W.........
W.W...W.W.WWWWWW.W.W.W...W.W..WW......W.W..........W....W.........W.WW.W...WWW..WW.WW.....W......WW.
.WWW..WW..W.....WW....WW.WW...........W.WW.W......WW....W..W.....WW.....W.......WW..W...WWW.........
..W..WW..........WW....WW.WW..W..W.WW....W.......W...W.......W..W..W...W..WW....WW.....WWW....W.W...
W...W..W....W........WW..W.WWW.WW...W......W....W..W....W.W.W.W.....WW.W...W.W.WWW...WW....W.W.....W
.W..W..W.W..WWW..W.W.......W...........W....W.W.....WW........WW.....W....WW.W....W........W.....W..
.........W...W..WW...WW....W.WWW.W......W...W.WWW.....WW.W..WW......WW..W....W......W.W............W
W.....W..W...W..WW...W..W..W.W...W..WW.....W......WW..W....WWW....W......W...WW........W..WW......W.`;
// console.log(pathFinder(input1));
// console.log(pathFinder(input2));
// console.log(pathFinder(input3));
// console.log(pathFinder(input4));
// console.log(pathFinder(input5));
// console.log(pathFinder(input6));
// console.log(input1);
// console.log(bigMaze);
// test(input1);
// test(input3);
// test(input6);
// test(bigMaze);
t2 = `
..
..`;
t23 = `
...
...`;
t3 = `
...
...
...`;
t32 = `
..
..
..`;
t4 = `
....
....
....
....`;
// test(t0);
// test(t1);
// test(t2);
// test(t23);
// test(t32);
// test(t4);
// { count: 272 }
// default: 792.597ms
// { count: 50 }
// default: 59.450ms
// { count: 24 }
// default: 27.849ms
// { count: 16 }
// default: 14.990ms
test(bigMaze);