Lesson 5

Traversing 2D Grids with Conditional Moves in JavaScript

Introduction

Hello, and welcome back to our coding lesson series. In this unit, we have a fascinating problem at hand that uses the concept of 2D arrays or grids. What's interesting about this problem is that it involves not only the simple traversal of the grid but also making this traversal in a unique manner. Initially, the concept might seem a bit tricky, but as we dissect the task and take it step by step, you'll surely enjoy how it unfolds. Are you ready to embark on this adventure? Let's dive right in!

Task Statement

The task before us involves the creation of a JavaScript function named pathTraverse. This function should perform a particular ordered traversal through a 2D grid. The function will accept a grid represented as a 2D array number[][], along with the starting cell coordinates as parameters. Starting from the provided cell, the function should move in any one of the four possible directions toward an adjacent cell. However, a condition governs this selection: the new cell value should be strictly greater than the current cell's value. Think of this as navigating a hiking trail where you can only move to higher ground from your current position.

This pattern would continue as we keep selecting the next available, larger cell value. The traversal would halt when there are no cells left that satisfy our criteria. The final result of the function will be an Array that includes all the visited cell values in the order of their visitation.

Consider a 3x3 grid:

Plain text
11 2 3 24 5 6 37 8 9

If we start at the cell with the value 5, we can logically move to either 6 or 8. Let's say we choose 8; the only cell that we can now move to is 9. After this, we have no more moves left that fit our criteria. Hence, the function returns [5, 8, 9].

Step 1: Determine the Grid Dimensions and Possible Directions

The first thing we need to do is determine the dimensions of our grid, which is relatively easy in JavaScript using the length property. We can also establish the directions that our traversal can take. In the context of matrices, when we say we are moving "up," we are moving one step toward the first row (decreasing the row index). Similarly, moving "down" corresponds to moving one step toward the last row (increasing the row index), and moving left or right relates to decrementing or incrementing the column index, respectively.

JavaScript
1function pathTraverse(grid, startRow, startCol) { 2 const rows = grid.length; 3 const cols = grid[0].length; 4 const directions = [ 5 [-1, 0], // Up 6 [1, 0], // Down 7 [0, -1], // Left 8 [0, 1] // Right 9 ];

In the directions array, each pair represents a direction in terms of a pair (rowOffset, colOffset). So, if we are at a cell (r, c), moving up corresponds to going to the cell (r-1, c), moving down corresponds to (r+1, c), moving left corresponds to (r, c-1), and moving right corresponds to (r, c+1).

Step 2: Validate Starting Point and Set Up Visited Cells Recording

Once we have the grid's dimensions and the possible directions, we should validate the starting point and set up our visited cell recording mechanism.

JavaScript
1function pathTraverse(grid, startRow, startCol) { 2 const rows = grid.length; 3 const cols = grid[0].length; 4 5 // Check the validity of the input 6 if (startRow < 0 || startRow >= rows || startCol < 0 || startCol >= cols) { 7 console.error("Invalid input"); 8 return []; 9 } 10 11 // Define all four possible directions of movement 12 const directions = [ 13 [1, 0], [-1, 0], [0, -1], [0, 1] 14 ]; 15 16 // Start with the value at the starting cell 17 const visited = []; 18 visited.push(grid[startRow][startCol]);

The visited.push(grid[startRow][startCol]) line of code appends the value of the current cell to the visited array, which keeps track of all the cells we've visited so far in the order of their traversal. By doing this, we ensure that our final output will be a sequential list of the values we encounter during our traversal. The visited array is crucial as it provides the expected result of the function, representing the path taken through the 2D grid.

Step 3: Begin the Grid Traversal Process

Let's initiate the grid traversal process in our function. We first set up an infinite loop that will only stop when we break it based on a condition. Inside the infinite loop, for each iteration, we'll have the function try to select the next cell with the maximum value among the adjacent cells. If we find such a cell, we'll capture its value, and it will be our next cell.

JavaScript
1function pathTraverse(grid, startRow, startCol) { 2 const rows = grid.length; 3 const cols = grid[0].length; 4 5 // Check the validity of the input 6 if (startRow < 0 || startRow >= rows || startCol < 0 || startCol >= cols) { 7 console.error("Invalid input"); 8 return []; 9 } 10 11 // Define all four possible directions of movement 12 const directions = [ 13 [1, 0], [-1, 0], [0, -1], [0, 1] 14 ]; 15 16 // Start with the value at the starting cell 17 const visited = []; 18 visited.push(grid[startRow][startCol]); 19 20 while (currMax <= grid[startRow][startCol]) { 21 // Initialize the current maximum as the first we have seen so far 22 let currMax = visited[0]; 23 let nextRow = -1, nextCol = -1; 24 25 // Loop over each adjacent cell in all the directions 26 for (const dir of directions) { 27 // Calculate the new cell's row and column indices 28 const newRow = startRow + dir[0]; 29 const newCol = startCol + dir[1]; 30 31 // If the new cell is out of the grid boundary, ignore it 32 if (newRow < 0 || newRow >= rows || newCol < 0 || newCol >= cols) { 33 continue; 34 } 35 36 // If the new cell's value is greater than the current maximum 37 if (grid[newRow][newCol] > currMax) { 38 // Save it as the next cell to visit 39 nextRow = newRow; 40 nextCol = newCol; 41 currMax = grid[newRow][newCol]; 42 } 43 } 44 45 // Otherwise, go to the next cell 46 startRow = nextRow; 47 startCol = nextCol; 48 49 // Append the cell's value to the result list 50 visited.push(currMax); 51 } 52 53 // Return the list of visited cells' values 54 return visited; 55} 56 57const grid = [ 58 [1, 2, 3], 59 [4, 5, 6], 60 [7, 8, 9] 61]; 62const result = pathTraverse(grid, 1, 1); 63console.log(result); // Output should be [5, 8, 9]
Lesson Summary

Bravo! You've successfully solved a complex problem involving the traversal of a grid in a unique pattern. This function has tested not only your skills in JavaScript programming but also your ability to visualize spatial patterns.

Having digested this knowledge, it's now time to test your understanding and apply these concepts to similar problems. Watch out for the ensuing practice session, where you can dabble with more challenging problems and refine your problem-solving skills. Keep up the good work and happy coding!

Enjoy this lesson? Now it's time to practice with Cosmo!

Practice is how you turn knowledge into actual skills.