主要过程就是一圈一圈
容器需要能保存所遍历过的元素:队列 , 栈 ,数组
队列:操作受限制的线性表,先进先出,一般应用的问题:速度不匹配,多用户竞争资源。
顺序存储:头指针 front 指向对头元素,尾指针 rear 指向队尾元素的下一个位置。
队列顺序存储的顺序存储类型的描述:
操作:
链式存储: 链队列,一个同时带有队头指针和对尾指针的单链表,头指针指向对头结点,尾指针指向队尾结点,即单链表最后一个结点
代码描述:
如果bfs是使用队列,需要保证统一的顺时针或者逆时针。(先进先出)
如果bfs是使用栈,那么就需要第一圈是顺时针遍历,第二圈是逆时针遍历,第三圈是顺时针遍历。(先进后出)
栈:只允许在一端进行插入和删除操作的线性表,栈顶(top)线性表允许插入删除的一端,栈底(bottom), 空栈
应用:进制转换,表达式求值,括号匹配
顺序结构:一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶元素的位置。
代码结构表示:
操作:
栈的链式存储:链栈,优点:便于多个栈共享存储空间,通常单链表,没有头结点,LHead指向栈顶元素,
代码表示栈的链式存储的结构类型
题目:给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。
输入描述: 第一行包含两个整数 N, M,表示矩阵的行数和列数。 后续 N 行,每行包含 M 个数字,数字为 1 或者 0。
输出描述: 输出一个整数,表示岛屿的数量。如果不存在岛屿,则输出 0。
注意题目中每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成 (dfs的应用)
本题思路,是用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。
在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。
1:确认递归函数和参数 x,y ,visited 访问标记矩阵 ,grid-----作为二维列表来表示地图,邻接矩阵
2:终止条件就是全部遍历完成
3:处理目前搜索结点出发的路径