Quick Overview

Simulate one move of a two-player disc-flipping board game: place a piece, flip every run of opponent pieces enclosed by the player's own pieces in all eight directions, and return the board unchanged when the move is illegal. It tests careful grid traversal, precise legality rules and avoiding partial updates.

Simulate one disc-flipping board game move across all eight directions

Company: Amazon

Role: Software Engineer

Category: Coding & Algorithms

Difficulty: medium

Interview Round: Online Assessment

You are simulating one move of a two-player board game played on an `m x n` grid. Each cell is `0` (empty), `1` (a piece of player 1) or `2` (a piece of player 2). Given the board and one move, in which `player` places a piece on cell `(row, col)`, return the board after the move. When a piece is placed, every straight run of the opponent's pieces that is enclosed between the new piece and another piece of the same player is flipped to the player's color. All eight directions must be checked: up, down, left, right and the four diagonals. If the move is illegal, return the original board unchanged. ### Function Signature ```python def place_piece(board: list[list[int]], row: int, col: int, player: int) -> list[list[int]]: ``` ### Rules - Let `opponent = 3 - player`. In one direction, walk away from `(row, col)` one cell at a time. If the walk passes one or more consecutive `opponent` cells and then reaches a `player` cell, every `opponent` cell passed in that direction is flipped to `player`. - If the first cell in a direction is not an `opponent` cell, or if the walk reaches an empty cell or the edge of the board before reaching a `player` cell, nothing flips in that direction. - All flips are decided from the board as it was before the move. A piece flipped in one direction never causes further flips. - The move is legal only if `(row, col)` is empty and at least one opponent piece flips in at least one direction. A legal move places `player` at `(row, col)` and applies every flip. - If the move is illegal, return the board exactly as given: no piece is placed and nothing flips. - The returned grid has the same dimensions as the input. You may modify `board` in place or build a new grid; only the returned grid is checked. ### Constraints - `1 <= m, n <= 100`, where `m = len(board)` and `n = len(board[i])` for every row `i` - Every cell is `0`, `1` or `2`. - `0 <= row < m` and `0 <= col < n` - `player` is `1` or `2`. - The board may hold any arrangement of pieces; it does not have to be reachable in a real game. ### Examples **Example 1** ```text Input: board = [ [0, 0, 0, 0, 0], [2, 1, 1, 0, 0], [0, 0, 1, 1, 0], [0, 2, 0, 0, 0] ] row = 1, col = 3, player = 2 Output: [ [0, 0, 0, 0, 0], [2, 2, 2, 2, 0], [0, 0, 2, 1, 0], [0, 2, 0, 0, 0] ] ``` To the left, the run `(1, 2)`, `(1, 1)` of player 1 pieces ends at player 2's piece at `(1, 0)`, so both flip. Down and to the left, `(2, 2)` is enclosed by player 2's piece at `(3, 1)` and flips. Straight down, `(2, 3)` is followed by the empty cell `(3, 3)`, so it stays. Every other direction starts with an empty cell. **Example 2** ```text Input: board = [ [0, 0, 0, 0, 0], [2, 1, 1, 0, 0], [0, 0, 1, 1, 0], [0, 2, 0, 0, 0] ] row = 3, col = 0, player = 1 Output: [ [0, 0, 0, 0, 0], [2, 1, 1, 0, 0], [0, 0, 1, 1, 0], [0, 2, 0, 0, 0] ] ``` To the right, player 2's piece at `(3, 1)` is followed by the empty cell `(3, 2)`, so it is not enclosed. Up and up-right start with empty cells, and the other directions leave the board at once. Nothing flips, so the move is illegal and the board is returned unchanged. **Example 3** ```text Input: board = [ [0, 0, 0, 0, 0], [2, 1, 1, 0, 0], [0, 0, 1, 1, 0], [0, 2, 0, 0, 0] ] row = 1, col = 2, player = 2 Output: [ [0, 0, 0, 0, 0], [2, 1, 1, 0, 0], [0, 0, 1, 1, 0], [0, 2, 0, 0, 0] ] ``` Cell `(1, 2)` is already occupied, so the move is illegal, even though `(1, 1)` lies between it and player 2's piece at `(1, 0)`.

Overview: Simulate one move of a two-player disc-flipping board game: place a piece, flip every run of opponent pieces enclosed by the player's own pieces in all eight directions, and return the board unchanged when the move is illegal. It tests careful grid traversal, precise legality rules and avoiding partial updates.

You are simulating one move of a two-player board game played on an `m x n` grid. Each cell is `0` (empty), `1` (a piece of player 1) or `2` (a piece of player 2). Given the board and one move, in which `player` places a piece on cell `(row, col)`, return the board after the move. When a piece is placed, every straight run of the opponent's pieces that is enclosed between the new piece and another piece of the same player is flipped to the player's color. All eight directions must be checked: up, down, left, right and the four diagonals. If the move is illegal, return the original board unchanged. ### Rules - Let `opponent = 3 - player`. In one direction, walk away from `(row, col)` one cell at a time. If the walk passes one or more consecutive `opponent` cells and then reaches a `player` cell, every `opponent` cell passed in that direction is flipped to `player`. - If the first cell in a direction is not an `opponent` cell, or if the walk reaches an empty cell or the edge of the board before reaching a `player` cell, nothing flips in that direction. - All flips are decided from the board as it was before the move. A piece flipped in one direction never causes further flips. - The move is legal only if `(row, col)` is empty and at least one opponent piece flips in at least one direction. A legal move places `player` at `(row, col)` and applies every flip. - If the move is illegal, return the board exactly as given: no piece is placed and nothing flips. - The returned grid has the same dimensions as the input. You may modify `board` in place or build a new grid; only the returned grid is checked. ### Constraints - `1 <= m, n <= 100`, where `m = len(board)` and `n = len(board[i])` for every row `i` - Every cell is `0`, `1` or `2`. - `0 <= row < m` and `0 <= col < n` - `player` is `1` or `2`. - The board may hold any arrangement of pieces; it does not have to be reachable in a real game. ### Example 1 ```text Input: board = [ [0, 0, 0, 0, 0], [2, 1, 1, 0, 0], [0, 0, 1, 1, 0], [0, 2, 0, 0, 0] ] row = 1, col = 3, player = 2 Output: [ [0, 0, 0, 0, 0], [2, 2, 2, 2, 0], [0, 0, 2, 1, 0], [0, 2, 0, 0, 0] ] ``` To the left, the run `(1, 2)`, `(1, 1)` of player 1 pieces ends at player 2's piece at `(1, 0)`, so both flip. Down and to the left, `(2, 2)` is enclosed by player 2's piece at `(3, 1)` and flips. Straight down, `(2, 3)` is followed by the empty cell `(3, 3)`, so it stays. Every other direction starts with an empty cell. ### Example 2 ```text Input: board = [ [0, 0, 0, 0, 0], [2, 1, 1, 0, 0], [0, 0, 1, 1, 0], [0, 2, 0, 0, 0] ] row = 3, col = 0, player = 1 Output: [ [0, 0, 0, 0, 0], [2, 1, 1, 0, 0], [0, 0, 1, 1, 0], [0, 2, 0, 0, 0] ] ``` To the right, player 2's piece at `(3, 1)` is followed by the empty cell `(3, 2)`, so it is not enclosed. Up and up-right start with empty cells, and the other directions leave the board at once. Nothing flips, so the move is illegal and the board is returned unchanged.

Constraints

  • 1 <= m, n <= 100, where m = len(board) and n = len(board[i]) for every row i
  • Every cell is 0, 1 or 2.
  • 0 <= row < m and 0 <= col < n
  • player is 1 or 2.
  • The board may hold any arrangement of pieces; it does not have to be reachable in a real game.

Examples

Input: ([[0, 0, 0, 0, 0], [2, 1, 1, 0, 0], [0, 0, 1, 1, 0], [0, 2, 0, 0, 0]], 1, 3, 2)

Expected Output: [[0, 0, 0, 0, 0], [2, 2, 2, 2, 0], [0, 0, 2, 1, 0], [0, 2, 0, 0, 0]]

Explanation: Source Example 1: the left run and the down-left cell flip; straight down ends at an empty cell and stays.

Input: ([[0, 0, 0, 0, 0], [2, 1, 1, 0, 0], [0, 0, 1, 1, 0], [0, 2, 0, 0, 0]], 3, 0, 1)

Expected Output: [[0, 0, 0, 0, 0], [2, 1, 1, 0, 0], [0, 0, 1, 1, 0], [0, 2, 0, 0, 0]]

Explanation: Source Example 2: the only opponent run is followed by an empty cell, so the move is illegal and the board is unchanged.

Hints

  1. Each of the eight directions can be judged on its own. Starting next to (row, col), what must the sequence of cells look like for that direction to flip anything?
  2. Read every decision from the board as it was before the move, so a piece you flip can never open or close another run.
  3. An occupied target, or a move where no direction flips a piece, means the board comes back exactly as given.

Loading coding console...

Show the approach

Approach

Copy the board first, then examine the eight directions from (row, col) one at a time. In a direction (dr, dc), start at the neighbor and keep stepping while the cell is in bounds and holds an opponent piece, counting the run. The run is enclosed exactly when the count is positive and the walk stops on an in-bounds cell holding the player's piece; only then are those count cells set to the player's value in the copy. Invariant: every decision reads the original board and every write goes to the copy, so a piece flipped in one direction can never start, extend or close another run (no cascading), and the order in which directions are processed cannot change the result. The eight rays leave (row, col) in different directions and never share a cell, so their flips are independent. Correctness: a direction contributes flips if and only if it matches the rule (one or more consecutive opponent cells, then a player cell); a run that hits an empty cell, the board edge, or starts with a non-opponent cell contributes nothing. The move is legal exactly when the target is empty and at least one direction contributed, in which case the player's piece is placed at (row, col); otherwise the untouched copy, equal to the input, is returned. Edge cases: a 1x1 board has no neighbors and is always illegal; single-row or single-column boards only have two usable directions; an occupied target returns the board unchanged even when an enclosure exists; opponent pieces beyond the first closing piece are never touched.

Time complexity:
O(m * n)
Space complexity:
O(m * n)