477
来源:互联网 发布:猿题库数据从何来 编辑:程序博客网 时间:2024/05/22 00:47
2017.9.4
利用栈,对OOOOOO的区域进行广度有限的遍历,也就是说找到相连的一片区域,将这若干个结点作为一个整体统一处理。
如果这些节点中,有一个节点是边界节点,那么 needChange就为false,意思是不需要进行修改。
我觉得这种整体的思想要学会,比一个一个的处理要在逻辑上更为清晰一些。
check函数用来判断是不是边界节点。
public class Solution { /** * @param board a 2D board containing 'X' and 'O' * @return void */ public void surroundedRegions(char[][] board){if(board == null){return ;}// 行数int n = board.length;if(n <= 2){return ;}// 列数int m = board[0].length;if(m <=2){return ;}boolean [][]visit = new boolean[n][m];boolean [][]flag = new boolean[n][m]; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(board[i][j] == 'O' && visit[i][j] == false){ LinkedList<int[]> list = new LinkedList<int[]>(); LinkedList<int[]> res = new LinkedList<int[]>(); boolean needChange = true;// 判断这一组是不是需要改变 int []a = {i,j}; list.push(a); visit[i][j] = true; while(!list.isEmpty()){ int []b = list.pop(); res.push(b); if(needChange == true){ // 如果发现没有包围住,则不需要改变 if(!check(board,b[0],b[1],visit)){ needChange = false; } } if(isUp(b[0],b[1],visit,n,m,board)){ int []tmp = {b[0]-1,b[1]}; visit[b[0]-1][b[1]] = true; list.push(tmp); } if(isDown(b[0],b[1],visit,n,m,board)){ int []tmp = {b[0]+1,b[1]}; visit[b[0]+1][b[1]] = true; list.push(tmp); } if(isLeft(b[0],b[1],visit,n,m,board)){ int []tmp = {b[0],b[1]-1}; visit[b[0]][b[1]-1] = true; list.push(tmp); } if(isRight(b[0],b[1],visit,n,m,board)){ int []tmp = {b[0],b[1]+1}; visit[b[0]][b[1]+1] = true; list.push(tmp); } } if(needChange == true){ while(!res.isEmpty()){ int []tmp = res.pop(); board[tmp[0]][tmp[1]] = 'X'; } } } } } }// isUp,isDown,isRight,isLeft这四个函数用来判断,上下左右是不是还有相连的O。public boolean isUp(int i,int j,boolean [][]visit,int n,int m,char[][] board){if(i-1 >= 0 && board[i-1][j] == 'O' && visit[i-1][j] == false){return true;}elsereturn false;}public boolean isLeft(int i,int j,boolean [][]visit,int n,int m,char[][] board){if(j-1 >= 0 && board[i][j-1] == 'O' && visit[i][j-1] == false){return true;}elsereturn false;}public boolean isDown(int i,int j,boolean [][]visit,int n,int m,char[][] board){if(i+1 < n && board[i+1][j] == 'O' && visit[i+1][j] == false){return true;}elsereturn false;}public boolean isRight(int i,int j,boolean [][]visit,int n,int m,char[][] board){if(j+1 < m && board[i][j+1] == 'O' && visit[i][j+1] == false){return true;}elsereturn false;}public boolean check(char[][] board,int i,int j,boolean[][] visit){int n = board.length;int m = board[0].length;if(i*j == 0 || i == n -1 || j == m-1){return false;}return true;}}
阅读全文
0 0
- 477
- SRM 477
- ocp-477
- SRM 477 DIV1 1000
- nan yang 477
- NYOJ 399、458、477
- nyoj 477 a+bproblem
- SGU 477 doors
- OCP-V13-477
- #477 Surrounded Regions
- Codeforces 477D
- Leetcode 477: hamming distance
- LeetCode 461 191 477
- leetcode 477解答
- LeetCode No.477 TotalHammingDistance
- 【组合数学】SRM 477 CarelessSecretary
- 477 A+B Problem III
- 477 D. Dreamoon and Binary
- c#之委托 (窗体传指)
- volatile的作用
- 使用反射以及泛型技术相结合实现简单工厂模式
- Qt5开发学习之文件及磁盘操作(十一)
- 拯救小鸡
- 477
- Spring(20)——PropertySource
- 动态规划——回文串最小分割数
- 第一天学习记录
- Django文件存储(二)定制存储系统
- OpenCV-3编译安装方法及常见错误解决(Ubuntu平台)
- 函数式编程
- iOS面试必看,最全梳理
- 实验吧-看起来有点难