Lesson 2

Hello, budding programmer! Are you ready to embark on a journey into the land of matrices? In this unit, we're in for a thrilling ride into the world of **unique matrix traversal**. We'll be navigating through the realm of *2D arrays* following an intriguing and distinctive order. Stay seated, and let's dive right in!

Suppose we have a matrix where each cell represents a distinct symbol or integer. Our task is to decode this matrix by reading the cells in a particular order.

The decoding begins from the top-left cell of the matrix. We move in a bottom-left downward diagonal direction until we hit the left boundary. Upon hitting the left boundary, we move one cell down (unless we're at the bottom-left corner already, in which case we move one cell to the right) and start moving in an upward diagonal direction towards the upper-right.

While moving diagonally up-right, if we hit the top boundary, we move one cell to the right and start moving in a downward diagonal direction towards the bottom-left. However, if we hit the right boundary while moving diagonally upward, we move one cell down and start moving in a bottom-left direction. In other words, we keep zigzagging diagonally across the matrix until every cell in the matrix is visited.

Upon completing this zigzag traversal, we will have a list of traversed cell values. Next, we process this list to uncover the indices of the perfect square numbers. The function should implement this traversal and return a list containing the 1-indexed positions of perfect square numbers in the traversed sequence.

Take a 3x4 matrix for instance:

Plain text`1{ 2 {1, 2, 3, 4}, 3 {5, 6, 7, 8}, 4 {9, 10, 11, 12} 5}`

Upon completing the diagonal traversal, we'll get the list: `{1, 5, 2, 3, 6, 9, 10, 7, 4, 8, 11, 12}`

. From this list, we see that `1`

, `9`

, and `4`

are perfect squares and are located at the 1st, 6th, and 9th positions (1-indexed) in the list. Thus, our function returns: `{1, 6, 9}`

.

To tackle this problem, we will take the following steps:

**Traverse the Matrix Diagonally**: Begin from the top-left cell and zigzag through the matrix in a specific diagonal pattern.**Record Traversed Values**: As you traverse, collect the cell values in a list.**Identify Perfect Squares**: Inspect the collected values to determine which are perfect squares.**Return Positions**: Gather the 1-indexed positions of the perfect squares in the list and return them.

First, let's scrutinize the dimensions of the matrix. To map the landscape of our matrix, we'll use `matrix.length`

to determine the number of rows and `matrix[0].length`

to determine the number of columns. Next, we initialize two arrays: `traversal`

and `results`

. The `traversal`

array will be responsible for keeping the cell values that we will obtain from the matrix based on our unique diagonal zigzag traversal. The `results`

array will be populated later with the 1-indexed positions of perfect square numbers that can be found in the `traversal`

list.

JavaScript`1function diagonalTraverseAndSquares(matrix) { 2 let rows = matrix.length, cols = matrix[0].length; 3 let traversal = []; 4 let results = [];`

The next step involves the actual traversal of the matrix. This process is done diagonally in a zigzag pattern. We begin from the top-left corner (cell `[0][0]`

) and make our journey through the matrix using two variables, `row`

and `col`

, to track the cell indices. We also initialize `dir`

with `1`

, which dictates that the starting direction is the down-left direction.

However, when we hit an edge, it's not just a simple left-right or up-down movement; we need to ensure we change our direction. Let `dir = -1`

dictate the up-right direction. To ensure we continue the correct diagonal movement and don't exceed the matrix boundaries, we use conditional checks within the loop.

JavaScript`1 let row = 0, col = 0, dir = 1; 2 for (let i = 0; i < rows * cols; i++) { // Loop runs for the total number of cells in the matrix. 3 traversal.push(matrix[row][col]); // Append the current cell value to traversal. 4 5 // Logic to control direction based on edges: 6 if (dir == 1) { // Moving down-left 7 if (row == rows - 1) { 8 col += 1; 9 dir = -1; 10 } else if (col == 0) { 11 row += 1; 12 dir = -1; 13 } else { 14 row += 1; 15 col -= 1; 16 } 17 } else { // Moving up-right 18 if (col == cols - 1) { 19 row += 1; 20 dir = 1; 21 } else if (row == 0) { 22 col += 1; 23 dir = 1; 24 } else { 25 row -= 1; 26 col += 1; 27 } 28 } 29 }`

With a completed traversal, we have obtained a list of integers. Next, we evaluate this list to identify perfect squares — numbers that are the squares of integers. In JavaScript, we can utilize `Math.sqrt`

and `Math.floor`

methods to test whether a given number is a perfect square. If the square root of the number, when floored, remains unchanged, the number is a perfect square. For each perfect square in the traversal list, we add its 1-indexed position to the `results`

list.

JavaScript`1 for (let idx = 0; idx < traversal.length; idx++) { 2 let val = traversal[idx]; 3 let root = Math.sqrt(val); 4 if (root === Math.floor(root)) { // Check if the value is a perfect square number. 5 results.push(idx + 1); 6 } 7 } 8 9 return results; 10}`

Let's see how to use the `diagonalTraverseAndSquares`

function we have developed. Suppose we have a 4x4 matrix:

JavaScript`1let matrix = [ 2 [16, 2, 3, 13], 3 [5, 11, 10, 8], 4 [9, 7, 6, 12], 5 [4, 14, 15, 1] 6]; 7 8let result = diagonalTraverseAndSquares(matrix); 9console.log(result); // Output: [ 1, 6, 7, 16 ]`

Here's what's going on:

- We define a 4x4 matrix
`matrix`

. - We call the
`diagonalTraverseAndSquares`

function with`matrix`

as its argument. - The function returns a list
`[ 1, 6, 7, 16 ]`

, which represents the 1-indexed positions of perfect square numbers in the traversed sequence.

For further verification, let's decode this traversal step-by-step:

- Diagonal traversal sequence:
`{16, 5, 2, 3, 11, 9, 4, 7, 10, 13, 8, 6, 14, 15, 12, 1}`

- Perfect squares in the sequence:
`16`

(1st),`9`

(6th),`4`

(7th),`1`

(16th)

Thus, the 1-indexed positions of perfect squares are correctly identified as `[ 1, 6, 7, 16 ]`

.

Bravo! You've successfully navigated a challenging task involving a unique matrix traversal pattern. You've demonstrated solid skills in JavaScript programming, especially in list manipulation, and tackled the challenges of moving around two-dimensional arrays with finesse. Now, it's time to put your newly learned skills to the test! Try out more complex matrices and different values to truly master the concept. Keep experimenting, and you'll soon become a wizard at matrix traversals. Happy coding!