zoukankan      html  css  js  c++  java
  • [LeetCode] Surrounded Regions, Solution


    Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'.
    A region is captured by flipping all 'O's into 'X's in that surrounded region .
    For example,
    X X X X
    X O O X
    X X O X
    X O X X
    After running your function, the board should be:
    X X X X
    X X X X
    X X X X
    X O X X
    » Solve this problem

    [解题思路]
    刚拿到这个题,首先得想法就是BFS。对于每一个O,扫描其相邻节点,然后标示之,如果一个联通区域中有任何一个O在边界上,则保留之,否则清除该联通域。实现代码如下:
    1:    vector<int> xIndex;  
    2: vector<int> yIndex;
    3: map<int, int> visited;
    4: void solve(vector<vector<char>> &board) {
    5: int row = board.size();
    6: if(row == 0) return;
    7: int col = board[0].size();
    8: for(int i =0; i < row; i++)
    9: {
    10: for(int j =0; j< col; j++)
    11: {
    12: if(board[i][j] == 'X' || IsVisited(i*row+j)) continue;
    13: visited.clear();
    14: bool surranded = true;
    15: xIndex.clear();
    16: xIndex.push_back(i);
    17: yIndex.clear();
    18: yIndex.push_back(j);
    19: int k =0;
    20: while(k<xIndex.size())
    21: {
    22: int x = xIndex[k];
    23: int y = yIndex[k];
    24: visited[x*row +y] =1;
    25: if(IsInBoundary(x, y, row, col)) surranded = false;
    26: if(x<row-1 && board[x+1][y] == 'O' && !IsVisited((x+1)*row+y)) {xIndex.push_back(x+1); yIndex.push_back(y);}
    27: if(y<col-1 && board[x][y+1] == 'O' && !IsVisited(x*row+y+1)) {xIndex.push_back(x); yIndex.push_back(y+1);}
    28: k++;
    29: }
    30: if(surranded) //clean the surranded mask
    31: {
    32: for(int m = 0; m<xIndex.size(); m++)
    33: {
    34: board[xIndex[m]][yIndex[m]] = 'X';
    35: }
    36: }
    37: }
    38: }
    39: }
    40: bool IsInBoundary(int x, int y, int row, int col)
    41: {
    42: if(x ==0 || x == row-1) return true;
    43: if(y ==0 || y == col-1) return true;
    44: return false;
    45: }
    46: bool IsVisited(int index)
    47: {
    48: if(visited.find(index) == visited.end()) return false;
    49: return true;
    50: }
    小数据可以过,但是大数据提示Memory Limit Exceeded,代码中唯一用到的就是visited这个map,所以,系统期望的方法应该是不需要辅助空间的。

    转换一下思路,真的需要开辟一个map在存储访问信息吗?其实这个可以省掉的,既然已经知道连通区域必须至少一个元素是在四边,那么一开始直接从四边开始扫描就好了,所以无法connect到得元素都是应该被清除的。所以,算法如下:
    1. 从四条边上的O元素开始BFS,所有相连的O都赋个新值,比如‘Y’
    2. 扫描整个数组,所有现存的O元素全部置为X,所有Y元素置为O
    打完收工。代码实现如下:

    1:       vector<int> xIndex;  
    2: vector<int> yIndex;
    3: void solve(vector<vector<char>> &board) {
    4: int row = board.size();
    5: if(row == 0) return;
    6: int col = board[0].size();
    7: xIndex.clear();
    8: yIndex.clear();
    9: for(int i =0; i< row; i++)
    10: {
    11: if(board[i][0] == 'O')
    12: {
    13: xIndex.push_back(i);
    14: yIndex.push_back(0);
    15: }
    16: if(board[i][col-1] == 'O')
    17: {
    18: xIndex.push_back(i);
    19: yIndex.push_back(col-1);
    20: }
    21: }
    22: for(int i =0; i< col; i++)
    23: {
    24: if(board[0][i] == 'O')
    25: {
    26: xIndex.push_back(0);
    27: yIndex.push_back(i);
    28: }
    29: if(board[row-1][i] == 'O')
    30: {
    31: xIndex.push_back(row-1);
    32: yIndex.push_back(i);
    33: }
    34: }
    35: int k =0;
    36: while(k<xIndex.size())
    37: {
    38: int x = xIndex[k];
    39: int y = yIndex[k];
    40: board[x][y] = 'Y';
    41: if(x>0 && board[x-1][y] == 'O' ) {xIndex.push_back(x-1); yIndex.push_back(y);}
    42: if(x<row-1 && board[x+1][y] == 'O' ) {xIndex.push_back(x+1); yIndex.push_back(y);}
    43: if(y>0 && board[x][y-1] == 'O' ) {xIndex.push_back(x); yIndex.push_back(y-1);}
    44: if(y<col-1 && board[x][y+1] == 'O' ) {xIndex.push_back(x); yIndex.push_back(y+1);}
    45: k++;
    46: }
    47: for(int i =0; i< row; i++)
    48: {
    49: for(int j =0; j< col; j++)
    50: {
    51: if(board[i][j] =='O') board[i][j] = 'X';
    52: if(board[i][j] == 'Y') board[i][j] = 'O';
    53: }
    54: }
    55: }



  • 相关阅读:
    写文件
    CI使用数据库
    ajxa方法
    find---查找文件或目录
    diff---比较文件不同
    ifup&&ifdown --- 激活/关闭指定的网络接口。
    ifconfig---配置和显示Linux内核中网络接口
    ssh-agent && 及 ssh-add介绍
    host---域名查询
    tracepath---追踪并显示报文到达目的主机所经过的路由信息。
  • 原文地址:https://www.cnblogs.com/codingtmd/p/5078897.html
Copyright © 2011-2022 走看看