被围绕的区域-LintCode

来源:互联网 发布:金牌网吧奖励软件 编辑:程序博客网 时间:2024/06/06 03:02

给一个二维的矩阵,包含 ‘X’ 和 ‘O’, 找到所有被 ‘X’ 围绕的区域,并用 ‘X’ 填充满。

样例:
给出二维矩阵:

X X X XX O O XX X O XX O X X

把被 ‘X’ 围绕的区域填充之后变为:

X X X XX X X XX X X XX O X X
#ifndef C477_H#define C477_H#include<iostream>#include<vector>#include<map>using namespace std;class Solution {public:    /*    * @param board: board a 2D board containing 'X' and 'O'    * @return: nothing    */    void surroundedRegions(vector<vector<char>> &board) {        // write your code here        if (board.empty())            return;        int row = board.size();        int col = board[0].size();        map<int, int> visited;        vector<vector<int>> dic{ { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } };//方便查找上下左右位置的元素        for (int i = 0; i < row; ++i)        {            for (int j = 0; j < col; ++j)            {                if (board[i][j] == 'O'&&visited.find(i*col + j) == visited.end())//遍历到所有的“岛”                {                    change(board, visited);                                      //根据visited中的值,改变board中值                    build(board, dic, visited, i, j);                            //构建visited                }            }        }        change(board, visited);    }    //递归遍历,区分出元素位于board边界的情况    void build(vector<vector<char>> &board, vector<vector<int>> dic, map<int, int> &visited, int i, int j)    {        int row = board.size();        int col = board[0].size();        if (i < 0 || j < 0 || i >= row || j >= col)            return;        if (board[i][j] == 'X' || visited[i*col + j] == 1||visited[i*col+j]==2)            return;        if (i == 0 || j == 0 || i == row - 1 || j == col - 1)            visited[i*col + j] = 2;        else            visited[i*col + j] = 1;        for (auto c : dic)        {            int x = i + c[0];            int y = j + c[1];            build(board, dic, visited, x, y);        }    }    //若不存在元素在位于board边界,将visited中保存的位置上的元素都置为'X'    void change(vector<vector<char>> &board, map<int, int> &visited)    {        int row = board.size();        int col = board[0].size();        if (visited.empty())            return;        bool isSurrended = false;        for (auto c : visited)        {            if (c.second == 2)            {                isSurrended = true;                break;            }        }        if (!isSurrended)        {            for (auto c : visited)            {                board[c.first / col][c.first%col] = 'X';            }        }        visited.clear();    }};#endif
原创粉丝点击