class Solution { public: queue<pair<int, int>> q; // 用来归还之前染过色的节点 queue<pair<int, int>> q_back; // 访问标记 vector<vector<int>> v; bool is_back; void check(int x, int y, vector<vector<char>>& grid) { int m = grid.size(); int n = grid[0].size(); if(x >= 0 && x < m && y>=0 && y<n) { if(grid[x][y] == 'O') { q.push(make_pair(x,y)); q_back.push(make_pair(x,y)); grid[x][y] = 'X'; v[x][y] = true; } } else { is_back = true; } } void floodfill(int x, int y, vector<vector<char>>& grid) { // 默认是不需要还回去的 is_back = false; q.push(make_pair(x,y)); q_back.push(make_pair(x,y)); //进行染色 grid[x][y] = 'X'; v[x][y] = true; while(!q.empty()) { auto tmp = q.front(); int x_ = tmp.first; int y_ = tmp.second; q.pop(); check(x_-1,y_,grid); check(x_+1,y_,grid); check(x_,y_-1,grid); check(x_,y_+1,grid); } if(is_back) { while(!q_back.empty()) { auto tmp = q_back.front(); grid[tmp.first][tmp.second] = 'O'; q_back.pop(); } } } void solve(vector<vector<char>>& grid) { //条件判断 int m = grid.size(); if(m==0) return; int n = grid[0].size(); if(n==0) return; // 是否已经访问过了 每个节点仅访问一次、 v.resize(m, vector<int>(n, false)); for(int i=0; i<m;++i) { for(int j=0;j<n;++j) { while(!q_back.empty()) { q_back.pop(); } if(grid[i][j] == 'O' && v[i][j]==false) { floodfill(i,j,grid); } } } } };
Leetcode 130. 被围绕的区域
猜你喜欢
转载自www.cnblogs.com/randyniu/p/9220889.html
今日推荐
周排行