题解 | #牛群的活动区域#

牛群的活动区域

https://www.nowcoder.com/practice/eabeca0c6e944a618f8adfed128d847e

知识点:dfs

思路:我们使用二维布尔数组来记录位置是否已经被访问过。我们遍历每个边界的 ‘B’,然后从这些位置开始进行深度优先搜索,将所有与边界上的 ‘B’ 相连的 ‘B’ 标记为已访问。最后,我们再遍历整个矩阵,将未被访问的位置标记为 ‘A’。

编程语言:java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param board char字符型二维数组
     * @return char字符型二维数组
     */
    int[] dx = {-1, 0, 1, 0};
    int[] dy = {0, -1, 0, 1};
    public char[][] solve(char[][] board) {
        int n = board.length;
        int m = board[0].length;
        boolean[][] st = new boolean[n][m];

        for (int i = 0; i < n; i++) {
            if (!st[i][0] && board[i][0] == 'B') {
                st[i][0] = true;
                dfs(i, 0, n, m, board, st);
            }
            if (!st[i][m - 1] && board[i][m - 1] == 'B') {
                st[i][m - 1] = true;
                dfs(i, m - 1, n, m, board, st);
            }
        }

        for (int i = 0; i < m; i++) {
            if (!st[0][i] && board[0][i] == 'B') {
                st[0][i] = true;
                dfs(0, i, n, m, board, st);
            }
            if (!st[n - 1][i] && board[n - 1][i] == 'B') {
                st[n - 1][i] = true;
                dfs(n - 1, i, n, m, board, st);
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (board[i][j] == 'A') continue;
                if (!st[i][j]) board[i][j] = 'A';
            }
        }

        return board;
    }

    private void dfs(int x, int y, int n, int m, char[][] board, boolean[][] st) {
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx >= 0 && nx < n && ny >= 0 && ny < m && !st[nx][ny] &&
                    board[nx][ny] == 'B') {
                st[nx][ny] = true;
                dfs(nx, ny, n, m, board, st);
            }
        }
    }
}

全部评论

相关推荐

HNU_fsq:建议直接出国,这简历太6了。自愧不如
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务