leetcode_Number of Islands_medium--dfs
2016-02-22 11:13
417 查看
Given a 2d grid map of
(water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example 1:
Answer: 1
Example 2:
Answer: 3
题目:其实本质上类似于,给了一个矩形点阵,找连通域个数。
方法:深度优先搜索(dfs)
class Solution {
private:
int res=0;
int dfs(vector<vector<char>> &grid,vector<vector<char>> &vis,int i,int j)
{
vis[i][j]=1;//已访问
if(i>0)
if(0 == vis[i-1][j] && '1' == grid[i-1][j])
dfs(grid,vis,i-1,j);//访问正上方节点
if(j < grid[0].size()-1)
if(0 == vis[i][j+1] && '1' == grid[i][j+1])
dfs(grid,vis,i,j+1);//访问正右边节点
if(i < grid.size()-1)
if(0 == vis[i+1][j] && '1' == grid[i+1][j])
dfs(grid,vis,i+1,j);//访问正下方节点
if(j>0)
if(0 == vis[i][j-1] && '1'== grid[i][j-1])
dfs(grid,vis,i,j-1);//访问正左边节点
return 0;
}
public:
int numIslands(vector<vector<char>>& grid) {
if(grid.empty() == true)
return 0;
int rows=grid.size(),cols=grid[0].size();
vector<char> tmp(cols,0);
vector<vector<char> > vis(rows,tmp);
for(int i=0; i<rows; i++)//遍历每行
for(int j=0; j<cols; j++)//遍历每列
{
if(0 == vis[i][j] && '1' == grid[i][j])//没有被访问过,且节点为1才进行搜索
{
res++;
dfs(grid,vis,i,j);
}
}
return res;
}
};
'1's (land) and
'0's
(water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example 1:
11110 11010 11000 00000
Answer: 1
Example 2:
11000 11000 00100 00011
Answer: 3
题目:其实本质上类似于,给了一个矩形点阵,找连通域个数。
方法:深度优先搜索(dfs)
class Solution {
private:
int res=0;
int dfs(vector<vector<char>> &grid,vector<vector<char>> &vis,int i,int j)
{
vis[i][j]=1;//已访问
if(i>0)
if(0 == vis[i-1][j] && '1' == grid[i-1][j])
dfs(grid,vis,i-1,j);//访问正上方节点
if(j < grid[0].size()-1)
if(0 == vis[i][j+1] && '1' == grid[i][j+1])
dfs(grid,vis,i,j+1);//访问正右边节点
if(i < grid.size()-1)
if(0 == vis[i+1][j] && '1' == grid[i+1][j])
dfs(grid,vis,i+1,j);//访问正下方节点
if(j>0)
if(0 == vis[i][j-1] && '1'== grid[i][j-1])
dfs(grid,vis,i,j-1);//访问正左边节点
return 0;
}
public:
int numIslands(vector<vector<char>>& grid) {
if(grid.empty() == true)
return 0;
int rows=grid.size(),cols=grid[0].size();
vector<char> tmp(cols,0);
vector<vector<char> > vis(rows,tmp);
for(int i=0; i<rows; i++)//遍历每行
for(int j=0; j<cols; j++)//遍历每列
{
if(0 == vis[i][j] && '1' == grid[i][j])//没有被访问过,且节点为1才进行搜索
{
res++;
dfs(grid,vis,i,j);
}
}
return res;
}
};
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性