Lesson 4

Hello, and welcome, code explorer! Today's journey takes us through the intricate paths within a **2-dimensional array**, often likened to a game board. Our mission is to identify ideal spots for game piece placement. Sounds like an adventure, doesn't it? Let's embark!

Visualize a chessboard in the form of a 2D array, where each cell could be marked 'E' for empty or 'P' for a piece. Our quest involves summoning a Python function named `find_positions()`

. Upon examining this 2D array, this function identifies all the spots where a new piece could be placed so that it can move to another empty cell in one move. The catch is that a piece can move only to an immediately neighboring cell directly above, below, to the left, or right, but not diagonally.

Consider this 4x4 board for instance:

`1P E E P 2E P E P 3P E P P 4P E P E`

The function should render an output as: `[(0, 1), (0, 2), (1, 2), (2, 1), (3, 1)]`

. This output represents the positions where a new piece can fit perfectly and then be able to move in the next turn.

Stepping right into action, we start with an empty `positions`

list to help us log the sought positions. Understanding the dimensions of our ‘board’ paves the way for defining boundaries in our exploration mission. Now, how does one determine the size of a Python list? The answer lies in Python's `len()`

function.

Python`1def find_positions(board): 2 positions = [] 3 rows, cols = len(board), len(board[0])`

With our boundary map, we begin our expedition across the board. We use two nested `for`

loops to do this, traversing the entire board one cell at a time.

Python`1def find_positions(board): 2 positions = [] 3 rows, cols = len(board), len(board[0]) 4 5 for i in range(rows): 6 for j in range(cols): 7 # ensuing exploration`

What's the plan for each cell, you ask? While exploring each cell, our trusty Python code inspects if the cell is empty. If confirmed, it then peeks into the neighbors in the up, down, left, right directions. If another vacant cell ('E') is spotted, we jot down the main cell's position in our `result`

list.

Python`1def find_positions(board): 2 positions = [] 3 rows, cols = len(board), len(board[0]) 4 5 for i in range(rows): 6 for j in range(cols): 7 if board[i][j] == 'E': 8 if ((i > 0 and board[i-1][j] == 'E') or 9 (i < rows - 1 and board[i+1][j] == 'E') or 10 (j > 0 and board[i][j-1] == 'E') or 11 (j < cols - 1 and board[i][j+1] == 'E')): 12 positions.append((i, j)) 13 return positions 14 15board = [ 16 ['P', 'E', 'E', 'P'], 17 ['E', 'P', 'E', 'P'], 18 ['P', 'E', 'P', 'P'], 19 ['P', 'E', 'P', 'E'] 20] 21 22print(find_positions(board)) 23 24# Prints [(0, 1), (0, 2), (1, 2), (2, 1), (3, 1)]`

Neatly wrapped up, haven't we? Today we engaged in a thrilling treasure hunt and emerged victorious with the `positions`

list. This journey revealed the importance of understanding **2D arrays** and effectively maneuvering through them using Python. Striking a balance between precision and caution, we cleverly avoided unwanted recursion and harnessed the power of conditional statements to devise an efficient blueprint for our code.

Now that we've mastered the theory, we step into the realm of application - the practice field. Venture forth and make your mark by solving correlated challenges. And remember, persistence is the best companion for a coder. Happy coding!