求大佬帮忙看看这道题目

weixin_45906870 2020-08-16 06:01:03
岛屿数量
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

 

示例 1:

输入:
[
['1','1','1','1','0'],
['1','1','0','1','0'],
['1','1','0','0','0'],
['0','0','0','0','0']
]
输出: 1
示例 2:

输入:
[
['1','1','0','0','0'],
['1','1','0','0','0'],
['0','0','1','0','0'],
['0','0','0','1','1']
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

代码:

void dfs(char** grid, int gridSize, int gridColSize, int i, int j) {
if(grid[i][j] != '1') {
return;
}
grid[i][j] = '2'; //这个2是什么意思?
if(i > 0) { //这些if块看不懂想干什么
dfs(grid, gridSize, gridColSize, i - 1, j);
}
if(i < gridSize - 1) {
dfs(grid, gridSize, gridColSize, i + 1, j);
}
if(j > 0) {
dfs(grid, gridSize, gridColSize, i, j - 1);
}
if(j < gridColSize - 1) {
dfs(grid, gridSize, gridColSize, i, j + 1);
}
}

int numIslands(char** grid, int gridSize, int* gridColSize){ //这几个参数是干什么用的?
int num = 0;
int i, j;
for(i = 0; i < gridSize; i++) { //这两循环是想干什么?
for(j = 0; j < gridColSize[0]; j++) {
if(grid[i][j] == '1') {
num++;
dfs(grid, gridSize, gridColSize[i], i, j);
}
}
}
return num;
}

这是我在LeetCode上学队列和广度优先搜素时碰到的题目,老实说看完题目就蒙了,我连题目给的函数形参都没看懂。大佬们可以给我分析一下这段代码的思路吗?
...全文
251 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_45906870 2020-08-17
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
2是什么意思?2是把该位置原来为1的值改成2,表示该位置已经被访问过了。比如 [1,1,1,1,0]变成[2,1,1,1,0],表示第一个位置已经被访问过了。 if看不懂?这样吧,分开来解释可能不好理解,先跟你说说dfs函数的目的。dfs的目的就是要把上下左右连通的1都改成2,表示这些连通的1都被访问过了。下面用文字描述的方式来给你说明dfs是怎么实现的 首先判断该位置是否不为1,即if(grid[i][j]!=1),如果不为1,则说明该位置无法连通(为0的情况)或者已经被访问过(为2的情况),所以访问到该位置就停止继续往下进行(因为路已经堵了,不能连通了),所以直接return。 如果该位置为1,则设置grid[i][j]=2,表示该位置已经访问过。 然后if(i>0)判断该位置是否在最左边(也就是判断左边还能不能走),如果不在最左边(也就是左边还能走),则递归dfs继续访问该位置的左边的位置(i-1位置),也就是左边能走就继续递归往左访问。 然后if(i<gridSize-1)判断该位置是否在最右边(也就是判断右边还能不能走),如果不在最右边(也就是右边还能走),则递归dfs继续访问该位置的右边的位置(i+1位置),也就是右边能走就继续递归往右访问。 然后if(j>0)判断该位置是否在最上边(也就是判断上边还能不能走),如果不在最上边(也就是上边还能走),则递归dfs继续访问该位置的上边的位置(j-1位置),也就是上边能走就继续递归往上访问。 然后if(j<gridColSize-1)判断该位置是否在最下边(也就是判断下边还能不能走),如果不在最下边(也就是下边还能走),则递归dfs继续访问该位置的下边的位置(j+1位置),也就是下边能走就继续递归往下访问。 所以,整个dfs调用结束,就会把某个点(i,j)开始的1,以及上下左右连通的1都设为2,表示这些位置都被访问过,直到不能继续往下走(也就是被堵死),于是这些连通的1(最终变为2)就形成一个岛。 所以现在明白if(i>0)的意义了吧,表示判断是否还能往左走。 用你的示例2来简单说明numIslands执行过程 [1,1,0,0,0] [1,1,0,0,0] [0,0,1,0,0] [0,0,0,1,1] 第一次满足if(grid[i][j]==1),num++后执行dfs [2,2,0,0,0] [2,2,0,0,0] [0,0,1,0,0] [0,0,0,1,1] 第二次满足if(grid[i][j]==1),num++后执行dfs [2,2,0,0,0] [2,2,0,0,0] [0,0,2,0,0] [0,0,0,1,1] 第三次满足if(grid[i][j]==1),num++后执行dfs [2,2,0,0,0] [2,2,0,0,0] [0,0,2,0,0] [0,0,0,2,2] 此后grid里不再有1,即if(grid[i][j]==1)不再成立,同时i,j循环也结束,所以num一共++了3次,即有3个岛
真的太感谢了,懂了之后发现原来这么简单,没搞懂之前真的想破脑袋也不明白。
qybao 2020-08-17
  • 打赏
  • 举报
回复
numIslands的参数的意义: grid是二维数组,保存输入数据的每行的0和1。gridSize是输入数据的总行数。 gridColSize是输入数据每行的列数,也就是gridColSize[0]是第一行的列数,gridColSize[1]是第二行的列数,gridColSize[2]是第三行的列数,等等
qybao 2020-08-17
  • 打赏
  • 举报
回复
2是什么意思?2是把该位置原来为1的值改成2,表示该位置已经被访问过了。比如 [1,1,1,1,0]变成[2,1,1,1,0],表示第一个位置已经被访问过了。 if看不懂?这样吧,分开来解释可能不好理解,先跟你说说dfs函数的目的。dfs的目的就是要把上下左右连通的1都改成2,表示这些连通的1都被访问过了。下面用文字描述的方式来给你说明dfs是怎么实现的 首先判断该位置是否不为1,即if(grid[i][j]!=1),如果不为1,则说明该位置无法连通(为0的情况)或者已经被访问过(为2的情况),所以访问到该位置就停止继续往下进行(因为路已经堵了,不能连通了),所以直接return。 如果该位置为1,则设置grid[i][j]=2,表示该位置已经访问过。 然后if(i>0)判断该位置是否在最左边(也就是判断左边还能不能走),如果不在最左边(也就是左边还能走),则递归dfs继续访问该位置的左边的位置(i-1位置),也就是左边能走就继续递归往左访问。 然后if(i<gridSize-1)判断该位置是否在最右边(也就是判断右边还能不能走),如果不在最右边(也就是右边还能走),则递归dfs继续访问该位置的右边的位置(i+1位置),也就是右边能走就继续递归往右访问。 然后if(j>0)判断该位置是否在最上边(也就是判断上边还能不能走),如果不在最上边(也就是上边还能走),则递归dfs继续访问该位置的上边的位置(j-1位置),也就是上边能走就继续递归往上访问。 然后if(j<gridColSize-1)判断该位置是否在最下边(也就是判断下边还能不能走),如果不在最下边(也就是下边还能走),则递归dfs继续访问该位置的下边的位置(j+1位置),也就是下边能走就继续递归往下访问。 所以,整个dfs调用结束,就会把某个点(i,j)开始的1,以及上下左右连通的1都设为2,表示这些位置都被访问过,直到不能继续往下走(也就是被堵死),于是这些连通的1(最终变为2)就形成一个岛。 所以现在明白if(i>0)的意义了吧,表示判断是否还能往左走。 用你的示例2来简单说明numIslands执行过程 [1,1,0,0,0] [1,1,0,0,0] [0,0,1,0,0] [0,0,0,1,1] 第一次满足if(grid[i][j]==1),num++后执行dfs [2,2,0,0,0] [2,2,0,0,0] [0,0,1,0,0] [0,0,0,1,1] 第二次满足if(grid[i][j]==1),num++后执行dfs [2,2,0,0,0] [2,2,0,0,0] [0,0,2,0,0] [0,0,0,1,1] 第三次满足if(grid[i][j]==1),num++后执行dfs [2,2,0,0,0] [2,2,0,0,0] [0,0,2,0,0] [0,0,0,2,2] 此后grid里不再有1,即if(grid[i][j]==1)不再成立,同时i,j循环也结束,所以num一共++了3次,即有3个岛

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧