一片海洋中的陆地
来源:互联网 发布:淘宝哪家卤味店好吃 编辑:程序博客网 时间:2024/05/17 06:06
这个题目是很霸气的,这是一道算法题。
给定一个棋盘,n*n大小,可以把它想象成一片海洋,每个格子里面是0或者1,0代表海水,1代表土壤,求海洋中陆地的块数。
今晚吃晚饭时听学长分享了这个面试题,于是回来寻思着怎么做。
说实话,这个题目昨晚和学长交谈时有DFS的想法,回来却不敢去实现,看了leetcode上有一道一模一样的题目,看了别人的分享答案。
这个问题就是遍历每一个节点【把每个棋格当做是节点吧】,对每个节点发起DFS,如果是1就把这个1置为0,然后对这个节点的四周是1的节点进行DFS,搜完之后把结果
result++。
上代码:
class Solution {public: int numIslands(vector<vector<char>> &grid) { int ret = 0; if(grid.empty() || grid[0].empty()) return ret; int m = grid.size(); int n = grid[0].size(); for(int i = 0; i < m; i ++) { for(int j = 0; j < n; j ++) { if(grid[i][j] == '1') { dfs(grid, i, j, m, n); ret ++; } } } return ret; } void dfs(vector<vector<char>> &grid, int i, int j, int m, int n) { stack<Node*> stk; Node* rootnode = new Node(i, j); grid[i][j] = '0'; stk.push(rootnode); while(!stk.empty()) { Node* top = stk.top(); if(top->x > 0 && grid[top->x-1][top->y] == '1') {//check up grid[top->x-1][top->y] = '0'; Node* upnode = new Node(top->x-1, top->y); stk.push(upnode); continue; } if(top->x < m-1 && grid[top->x+1][top->y] == '1') {//check down grid[top->x+1][top->y] = '0'; Node* downnode = new Node(top->x+1, top->y); stk.push(downnode); continue; } if(top->y > 0 && grid[top->x][top->y-1] == '1') {//check left grid[top->x][top->y-1] = '0'; Node* leftnode = new Node(top->x, top->y-1); stk.push(leftnode); continue; } if(top->y < n-1 && grid[top->x][top->y+1] == '1') {//check right grid[top->x][top->y+1] = '0'; Node* rightnode = new Node(top->x, top->y+1); stk.push(rightnode); continue; } stk.pop(); } }};
这个是非递归版本。代码中DFS查找是把节点前后左右的1压栈,一一处理,直到栈里已经没有1处理了,所以是一个很容易想到的处理方法,对了,别忘了,处理完一个节点后pop出栈。
接下来上递归版本的代码:
class Solution {public: int numIslands(vector<vector<char>> &grid) { int ret = 0; if(grid.empty() || grid[0].empty()) return ret; int m = grid.size(); int n = grid[0].size(); for(int i = 0; i < m; i ++) { for(int j = 0; j < n; j ++) { if(grid[i][j] == '1') { dfs(grid, i, j, m, n); ret ++; } } } return ret; } void dfs(vector<vector<char>> &grid, int i, int j, int m, int n) { grid[i][j] = '0'; if(i > 0 && grid[i-1][j] == '1') dfs(grid, i-1, j, m, n); if(i < m-1 && grid[i+1][j] == '1') dfs(grid, i+1, j, m, n); if(j > 0 && grid[i][j-1] == '1') dfs(grid, i, j-1, m, n); if(j < n-1 && grid[i][j+1] == '1') dfs(grid, i, j+1, m, n); }};
这种递归版本比较简单,把节点置为0后对周围是1的节点发起DFS。
好了,感谢作者,虽然我忘记了是哪个网址,但是很感谢。
0 0
- 一片海洋中的陆地
- 陆地
- 一片风雨中的安乐
- GPS RTK在海洋测深中的应用(无验潮模式)
- 【shadertoy】海洋球 -- unity中的水面特效shader
- 陆地及喷图再讨论
- 天空盒陆地行动
- 陆地移动距离
- 缩小的陆地
- 缩小的陆地+排序
- 海洋源代码
- 数字海洋
- 海洋模拟
- 知识海洋
- 陆地与线的碰撞
- 陆地移动通信演进路线
- 从WM2到mesh陆地
- Tsinsen_ A1016. 缩小的陆地
- 简单到死的计算器C编程
- hdu 5202 Rikka with string
- 目标检测的图像特征提取之HOG特征
- MySQL语句
- Evaluate Reverse Polish Notation
- 一片海洋中的陆地
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结2——级联分类器与检测过程
- Color the fence
- 录制音乐MediaRecorder
- 系统加密
- ARCENGINE开发经典贴
- Python3学习笔记之基础教程
- matplotlib 和 numpy下载与安装(基于Python2.7.9)
- 如何在eclipse中添加android ADT ADT插件的安装图文教程