LeetCode-Surrounded Regions-BFS/DFS
https://oj.leetcode.com/problems/surrounded-regions/
很简单的一道图论题。BFS或者DFS都可解。对不同的连通域使用一个color每次进行标记扩散,再根据是否遍历过程遇到了边界点来判断是否为sorround。在不使用额外内存的限制下,通过修改board也可将其作为标志。
BFS的写法有些不熟。节点的访问标记需要在第一次遇到时标记。而不是出队列时再标记。这样才能保证队列里面的元素不重复。
typedef pair<int,int> scpair; class Solution { public: int color; int m,n; int BFS(int x,int y,vector<vector<char>> &board){ list <scpair> que; que.push_back(scpair(x,y)); board[y][x]=color; int res=0; while (!que.empty()){ scpair t=que.front(); que.pop_front(); int x=t.first; int y=t.second; if (x<=0 || x>=m-1 || y<=0|| y>=n-1){ res=1; } for (int i=-1;i<2;i++) for (int j=-1;j<2;j++){ if (i!=0 && j!=0){continue;} if (i==0 && j==0){continue;} if (x+j<0 || x+j>m-1|| y+i<0 || y+i>n-1){continue;} //cout<<x+j<<" "<<y+i<<endl; if (board[y+i][x+j]=='O'){ board[y+i][x+j]=color; que.push_back(scpair(x+j,y+i)); } } } return res; } void solve(vector<vector<char>> &board) { n=board.size(); if (n==0){return;} m=board[0].size(); if (m==0){return;} color=0; for (int i=0;i<n;i++) for (int j=0;j<m;j++){ if (board[i][j]=='O'){ //found a start point to dfs int f=BFS(j,i,board); if (!f){ for (int p=0;p<n;p++) for (int q=0;q<m;q++){ if (board[p][q]==color){ board[p][q]='X'; } } } color--; } } for (int i=0;i<n;i++) for (int j=0;j<m;j++){ if (board[i][j]!='X'){board[i][j]='O';} } } };