-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathsolution.js
90 lines (82 loc) · 2.18 KB
/
solution.js
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
"use strict";
class MatrixPrinter {
/**
*
* @param {number[][]} matrix
*/
constructor(matrix) {
this.matrix = matrix;
this.currentI = 0;
this.currentJ = 0;
this.numRows = matrix[0].length;
this.numColumns = matrix.length;
this.direction = 0;
this.numToPrint = this.numRows * this.numColumns;
}
isValid(i, j) {
return (
i >= 0 &&
i < this.numColumns &&
j >= 0 &&
j < this.numRows &&
this.matrix[i][j] !== null
);
}
changeDirection() {
this.direction = ++this.direction % 4;
}
moveRight() {
if (!this.isValid(this.currentI, this.currentJ + 1)) return false;
this.currentJ++;
return true;
}
moveLeft() {
if (!this.isValid(this.currentI, this.currentJ - 1)) return false;
this.currentJ--;
return true;
}
moveUp() {
if (!this.isValid(this.currentI - 1, this.currentJ)) return false;
this.currentI--;
return true;
}
moveDown() {
if (!this.isValid(this.currentI + 1, this.currentJ)) return false;
this.currentI++;
return true;
}
move() {
let hasMoved = false;
while (!hasMoved) {
switch (this.direction) {
case 0:
hasMoved = this.moveRight();
break;
case 1:
hasMoved = this.moveDown();
break;
case 2:
hasMoved = this.moveLeft();
break;
default:
hasMoved = this.moveUp();
}
if (!hasMoved) this.changeDirection();
}
return true;
}
printEspiral() {
let printed = 0;
do {
console.log(this.matrix[this.currentI][this.currentJ]);
this.matrix[this.currentI][this.currentJ] = null;
} while (++printed < this.numToPrint && this.move());
}
}
const test = [
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]
];
new MatrixPrinter(test).printEspiral();