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';}
		}
	}
};

  

posted @ 2014-10-03 01:36  zombies  阅读(208)  评论(0编辑  收藏  举报