Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Minesweeper

Updated
3 min read

Introduction

In this blog post, we will explore how to solve the LeetCode problem "529" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.

Problem Statement

Let's play the minesweeper game (Wikipedia, online game)! You are given an m x n char matrix board representing the game board where: 'M' represents an unrevealed mine, 'E' represents an unrevealed empty square, 'B' represents a revealed blank square that has no adjacent mines (i.e., above, below, left, right, and all 4 diagonals), digit ('1' to '8') represents how many mines are adjacent to this revealed square, and 'X' represents a revealed mine. You are also given an integer array click where click = [clickr, clickc] represents the next click position among all the unrevealed squares ('M' or 'E'). Return the board after revealing this position according to the following rules: If a mine 'M' is revealed, then the game is over. You should change it to 'X'. If an empty square 'E' with no adjacent mines is revealed, then change it to a revealed blank 'B' and all of its adjacent unrevealed squares should be revealed recursively. If an empty square 'E' with at least one adjacent mine is revealed, then change it to a digit ('1' to '8') representing the number of adjacent mines. Return the board when no more squares will be revealed. Example 1: Input: board = [["E","E","E","E","E"],["E","E","M","E","E"],["E","E","E","E","E"],["E","E","E","E","E"]], click = [3,0] Output: [["B","1","E","1","B"],["B","1","M","1","B"],["B","1","1","1","B"],["B","B","B","B","B"]] Example 2: Input: board = [["B","1","E","1","B"],["B","1","M","1","B"],["B","1","1","1","B"],["B","B","B","B","B"]], click = [1,2] Output: [["B","1","E","1","B"],["B","1","X","1","B"],["B","1","1","1","B"],["B","B","B","B","B"]] Constraints: m == board.length n == board[i].length 1 <= m, n <= 50 board[i][j] is either 'M', 'E', 'B', or a digit from '1' to '8'. click.length == 2 0 <= clickr < m 0 <= clickc < n board[clickr][clickc] is either 'M' or 'E'.

Explanation

  • Handle Mine Click: If the clicked cell is a mine ('M'), change it to 'X' and return the board.
    • Reveal Empty Square: If the clicked cell is an empty square ('E'), count adjacent mines. If no adjacent mines, change it to 'B' and recursively reveal adjacent unrevealed squares. If adjacent mines exist, change it to the number of adjacent mines (as a char).
    • Recursive Revelation: The core of the solution lies in a recursive (or iterative using a queue) approach to reveal connected empty squares.
  • Runtime Complexity: O(M N) in the worst case where the entire board needs to be revealed. Storage Complexity: O(M N) in the worst case for the recursion stack or queue used in iterative approach.

Code

    def updateBoard(board, lik):    m = len(board)
    n = len(board[0])
    row, col = click

    if board[row][col] == 'M':
        board[row][col] = 'X'
        return board

    def count_adjacent_mines(r, c):
        count = 0
        for i in range(max(0, r - 1), min(m, r + 2)):
            for j in range(max(0, c - 1), min(n, c + 2)):
                if (i, j) != (r, c) and board[i][j] == 'M':
                    count += 1
        return count

    def reveal(r, c):
        if r < 0 or r >= m or c < 0 or c >= n or board[r][c] != 'E':
            return

        mines = count_adjacent_mines(r, c)

        if mines == 0:
            board[r][c] = 'B'
            for i in range(max(0, r - 1), min(m, r + 2)):
                for j in range(max(0, c - 1), min(n, c + 2)):
                    reveal(i, j)
        else:
            board[r][c] = str(mines)

    reveal(row, col)
    return board

More from this blog

C

Chatmagic blog

2894 posts