[LeetCode] Surrounded Regions, Solution

本文探讨了如何使用广度优先搜索(BFS)解决棋盘游戏中的包围区翻转问题,通过从边界O元素开始扫描并标记相邻元素,最终清理所有无法连接到边界的O元素,实现问题的高效解决。

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

» Solve this problem

[解题思路]
刚拿到这个题,首先得想法就是BFS。对于每一个O,扫描其相邻节点,然后标示之,如果一个联通区域中有任何一个O在边界上,则保留之,否则清除该联通域。实现代码如下:

1:    vector<int> xIndex;  
2: vector<int> yIndex;
3: map<int, int> visited;
4: void solve(vector<vector<char>> &board) {
5: int row = board.size();
6: if(row == 0) return;
7: int col = board[0].size();
8: for(int i =0; i < row; i++)
9: {
10: for(int j =0; j< col; j++)
11: {
12: if(board[i][j] == 'X' || IsVisited(i*row+j)) continue;
13: visited.clear();
14: bool surranded = true;
15: xIndex.clear();
16: xIndex.push_back(i);
17: yIndex.clear();
18: yIndex.push_back(j);
19: int k =0;
20: while(k<xIndex.size())
21: {
22: int x = xIndex[k];
23: int y = yIndex[k];
24: visited[x*row +y] =1;
25: if(IsInBoundary(x, y, row, col)) surranded = false;
26: if(x<row-1 && board[x+1][y] == 'O' && !IsVisited((x+1)*row+y)) {xIndex.push_back(x+1); yIndex.push_back(y);}
27: if(y<col-1 && board[x][y+1] == 'O' && !IsVisited(x*row+y+1)) {xIndex.push_back(x); yIndex.push_back(y+1);}
28: k++;
29: }
30: if(surranded) //clean the surranded mask
31: {
32: for(int m = 0; m<xIndex.size(); m++)
33: {
34: board[xIndex[m]][yIndex[m]] = 'X';
35: }
36: }
37: }
38: }
39: }
40: bool IsInBoundary(int x, int y, int row, int col)
41: {
42: if(x ==0 || x == row-1) return true;
43: if(y ==0 || y == col-1) return true;
44: return false;
45: }
46: bool IsVisited(int index)
47: {
48: if(visited.find(index) == visited.end()) return false;
49: return true;
50: }

小数据可以过,但是大数据提示Memory Limit Exceeded,代码中唯一用到的就是visited这个map,所以,系统期望的方法应该是不需要辅助空间的。

转换一下思路,真的需要开辟一个map在存储访问信息吗?其实这个可以省掉的,既然已经知道连通区域必须至少一个元素是在四边,那么一开始直接从四边开始扫描就好了,所以无法connect到得元素都是应该被清除的。所以,算法如下:
1. 从四条边上的O元素开始BFS,所有相连的O都赋个新值,比如‘Y’
2. 扫描整个数组,所有现存的O元素全部置为X,所有Y元素置为O
打完收工。代码实现如下:

1:       vector<int> xIndex;  
2: vector<int> yIndex;
3: void solve(vector<vector<char>> &board) {
4: int row = board.size();
5: if(row == 0) return;
6: int col = board[0].size();
7: xIndex.clear();
8: yIndex.clear();
9: for(int i =0; i< row; i++)
10: {
11: if(board[i][0] == 'O')
12: {
13: xIndex.push_back(i);
14: yIndex.push_back(0);
15: }
16: if(board[i][col-1] == 'O')
17: {
18: xIndex.push_back(i);
19: yIndex.push_back(col-1);
20: }
21: }
22: for(int i =0; i< col; i++)
23: {
24: if(board[0][i] == 'O')
25: {
26: xIndex.push_back(0);
27: yIndex.push_back(i);
28: }
29: if(board[row-1][i] == 'O')
30: {
31: xIndex.push_back(row-1);
32: yIndex.push_back(i);
33: }
34: }
35: int k =0;
36: while(k<xIndex.size())
37: {
38: int x = xIndex[k];
39: int y = yIndex[k];
40: board[x][y] = 'Y';
41: if(x>0 && board[x-1][y] == 'O' ) {xIndex.push_back(x-1); yIndex.push_back(y);}
42: if(x<row-1 && board[x+1][y] == 'O' ) {xIndex.push_back(x+1); yIndex.push_back(y);}
43: if(y>0 && board[x][y-1] == 'O' ) {xIndex.push_back(x); yIndex.push_back(y-1);}
44: if(y<col-1 && board[x][y+1] == 'O' ) {xIndex.push_back(x); yIndex.push_back(y+1);}
45: k++;
46: }
47: for(int i =0; i< row; i++)
48: {
49: for(int j =0; j< col; j++)
50: {
51: if(board[i][j] =='O') board[i][j] = 'X';
52: if(board[i][j] == 'Y') board[i][j] = 'O';
53: }
54: }
55: }

基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力和滑模控制的强鲁棒性,用于解决复杂系统的控制问题,尤其适用于存在不确定性和外部干扰的动态系统。文中详细阐述了控制算法的设计思路、RBFNN的结构与权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效性和稳定性。此外,文档还列举了大量相关的科研方向和技术应用,涵盖智能优化算法、机器学习、电力系统、路径规划等多个领域,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领域的研究人员; 使用场景及目标:①学习和掌握RBF神经网络与滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度与鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思路,注重理论分析与仿真验证相结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值