Surrounded Regions


这个问题有那么点感觉,但是就是不对路,开始想的是从左上角到右下角,若其左和上都是‘X'就将其改为’X‘,然后再从右下往上反,将“误杀”的还原回来,当然这要借助复制的一份board,但最终结果还是不对,因为有出现“弯路”的时候就不行了,后来想着再从右上到左下也如此操作一番,最终是没能得逞。几天无果,看了下discuss区,顿感醍醐灌顶,再看这个题,就 是呵呵。

思路是从外围是’O'的开始深度往里走,这时候里面的‘O'就有两种命运,一种是跟外围的’O'是联通的,那么这些‘O'就可以存活,剩下的孤立的’O'就没办法了,就只能被‘X'了,为了区分这两种’O',我们把联通 的‘O'改为另外一种统一而独立的字符,便于后期做恢复。这就是三步走(或两步)。

1)首先从外围的‘O'处深度搜索,见到链接的’O'就把他们都改为其他标识。

2)将剩余的孤立的’O'改为‘X',同时,将遇到标识符改为’O'。

简单吧,简单的一塌糊涂,但是这种思路太精髓了。

详细参考见:http://discuss.leetcode.com/questions/1223/surrounded-regions

                                http://blog.sina.com.cn/s/blog_b9285de20101j1dt.html

class Solution {
private:
	int rows;
	int cols;
public:
	void dfs(int row, int col,vector<vector<char> >& board)
	{
		if(row < 0 || row >= rows || col < 0 || col >= cols) return;
		if(board[row][col] != 'O') return;
		board[row][col] = '+';
		dfs(row - 1, col, board);//up
		dfs(row, col + 1, board);//right
		dfs(row + 1, col, board);//down
		dfs(row, col - 1, board);//left
	}
	void solve(vector<vector<char> > &board)
	{
		if(board.size() == 0 || board[0].size() == 0)
			return;
		 rows = board.size();
		 cols = board[0].size();
		 for(int i = 0; i < rows; ++i){
			 dfs(i, 0, board);
			 dfs(i, cols - 1, board);
		 }
		 for (int j = 0; j < cols; ++j)
		 {
			 dfs(0, j, board);
			 dfs(rows - 1, j, board);
		 }
		 for(int i = 0; i < rows; ++i)
			 for (int j = 0; j < cols; ++j)
			 {
				if(board[i][j] == 'O')
					board[i][j] = 'X';
				else if(board[i][j] == '+')
					 board[i][j] = 'O';		 
			 }	 
	}
};


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值