考察知识点:回溯

题目分析:

题目中其实已经给出思路。我们可以遍历边界,当遇到B字符时,就是递归的入口。递归时就找到与之相邻的没有被访问过的B字符位置即可。

我这里新建了一个全是A,大小与board相同的数组。当遇到满足条件的B字符时就修改res的值,res也能帮助判断一个位置是否被访问过。

所用编程语言:C++

#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param board char字符型vector<vector<>> 
     * @return char字符型vector<vector<>>
     */
    void dfs(int i, int j, vector<vector<char>> &board, vector<vector<char>> &res) {
        res[i][j] = 'B';
        int dx[4] = {-1, 0, 1, 0};
        int dy[4] = {0, 1, 0, -1};
        int m = board.size();
        int n = board[0].size();

        if (i < 0 || i >= m || j < 0 || j >= n) return;
        for (int x = 0; x < 4; x++) {
            int row = i + dx[x];
            int col = j + dy[x];
            if (row >= 0 && row < m && col >= 0 && col < n && board[row][col] == 'B' && res[row][col] == 'A') {
                dfs(row, col, board, res);
            }
        }
    }
    vector<vector<char> > solve(vector<vector<char> >& board) {
        // write code here
        int m = board.size();
        int n = board[0].size();
        vector<vector<char>> res(m, vector<char>(n, 'A'));

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

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

        return res;
    }
};