• leetcode


    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


    解题思路:
    重新开辟一个空间: 存放每个点的信息。每个node的struct的结构如下:

    struct node{
    	public:
    		~node(){}
    		node(int x, int y, char c) :x(x), y(y), c(c){ yes = false; }
    		node(int x, int y, char c, bool a) :x(x), y(y), c(c), yes(a){}
    		bool operator==(const node &t){
    			return this->x == t.x&&this->y == t.y;
    		}
    		int x;
    		int y;
    		bool yes;             // 广度优先搜索中的 clor ,初始值为 false ,当遍历之后变为 true
    		char c;
    	};
    

    1/初始化每个node , c的值与board中的值相同,board中每个值变成‘X’

    2/从每四条边 搜索 yes == false 的 ‘O’

    3/ 沿着搜索到的‘O’ 向四个方向 扩展(广度优先搜索) , 利用queue存储周围的c==‘O’ &&yes==false 的node

    注: 每次向四周扩展时,在进入队列之前把yes=true; // 否则在后面搜索过程中还会把该点加入队列,当矩阵较大时程序用时增加上千倍  

    4/ 根据node矩阵中 为true的点都是被遍历过的点,将board中相同位置的值设为'O'

    void solve(vector<vector<char>>& board) {
            const int h = board.size();
            if(h==0) return ;
            const int l = board[0].size();
            vector<vector<node>> t;     
            for(int i=0;i<h;i++){                 // 初始化node矩阵t
                vector<node> temp;
                for(int j=0;j<l;j++){
                    node t_node(i,j,board[i][j],false);
                    temp.push_back(t_node);
                    board[i][j] = 'X';           // board矩阵全部置为‘X’,
                }
                t.push_back(temp);
            }
            for(int i=0;i<l;i++){
                if(t[0][i].c=='O'&&t[0][i].yes==false){
                    set(t,t[0][i],h,l);
                }
            }
            for(int i=0;i<l;i++){
                if(t[h-1][i].c=='O'&&t[h-1][i].yes==false){
                    set(t,t[h-1][i],h,l);
                }
            }
            for(int i=0;i<h;i++){
                if(t[i][0].c=='O'&&t[i][0].yes==false){
                    set(t,t[i][0],h,l);
                }
            }
            for(int i=0;i<h;i++){
                if(t[i][l-1].c=='O'&&t[i][l-1].yes==false){
                    set(t,t[i][l-1],h,l);
                }
            }  
            for(int i=0;i<h;i++){                      // 根据t中yes是否被遍历过,判断board中值是否为‘O’
                for(int j=0;j<l;j++){
                    if(t[i][j].yes){
                        board[i][j]='O';
                    }
                }
            }
            return ;
        }
        void set(vector<vector<node>>&d, node a, const int h, const int l){
            queue<node> q;
            q.push(a);
            d[a.x][a.y].yes = true;
            d[a.x][a.y].c = 'X';
            while (!q.empty()){
                node t = q.front();            
                q.pop();
                if (t.x + 1 < h&&d[t.x + 1][t.y].yes == false && d[t.x + 1][t.y].c == 'O')
                {
                    q.push(d[t.x + 1][t.y]);
                    d[t.x + 1][t.y].yes = true;           //进入队列时,把 yes的值改为true ,下次遍历时将不会再加入队列
              d[t.x + 1][t.y].c = 'X';
            }
           
    if (t.x - 1 >= 0 && d[t.x - 1][t.y].yes == false && d[t.x - 1][t.y].c == 'O')
           {
              q.push(d[t.x
    - 1][t.y]);
              d[t.x
    - 1][t.y].yes = true;
               d[t.x
    - 1][t.y].c = 'X';
           }
           
    if (t.y + 1 < l&&d[t.x][t.y + 1].yes == false && d[t.x][t.y + 1].c == 'O')
            {
                q.push(d[t.x][t.y
    + 1]);
                d[t.x][t.y
    + 1].yes = true;
                d[t.x][t.y
    + 1].c = 'X';
           }
           
    if (t.y - 1 >= 0 && d[t.x][t.y - 1].yes == false && d[t.x][t.y - 1].c == 'O')
            {
               q.push(d[t.x][t.y
    - 1]);
               d[t.x][t.y
    - 1].yes = true;  
               d[t.x][t.y
    - 1].c = 'X';
            }
         }
        
    return;
      }







  • 相关阅读:
    狗狗对主人的十句话
    微软提供正确卸载IE7的方法并恢复IE6
    c语言操作符的优先级
    linux 常用命令每日更新
    Visual Studio快捷键大全
    Opera将尽快发布补丁修复桌面浏览器漏洞 狼人:
    KILL杀毒软件重出江湖 公司股权全内资组成 狼人:
    图文:2010中国计算机网络安全年会华为展台 狼人:
    微软再次警告IE安全漏洞成为攻击目标 狼人:
    微软发布三月安全公告 两个补丁修补严重漏洞 狼人:
  • 原文地址:https://www.cnblogs.com/NeilZhang/p/5547111.html
Copyright © 2020-2023  润新知