搜索 - 遍历
- 每个节点都访问一次
- 每个节点仅访问一次
- 对于结点的访问顺序不限
-深度优先:DFS
-广度优先:BFS
深度优先搜索 (DFS)
深度优先遍历顺序:
解释:即先从头走到尾。尾部走不动了再退回上一个节点,看是否有分支,如有分支走分支…
通过例题分析:
本题注意的要点: 可以自由的在房间之间来回走动
代码如下:
int num; //num 用于记录一共遍历了多少房间
void dfs(int** rooms, int* roomsColSize, int* vist, int x){
vist[x] = true; //遍历过了的房间置1表示已经走过了
num++; //记录走过了多少房间
for(int i = 0; i < roomsColSize[x]; i++){
if(!vist[rooms[x][i]]){ //判断房间是否已经走过
dfs(rooms, roomsColSize, vist, rooms[x][i]);
}
}
}
bool canVisitAllRooms(int** rooms, int roomsSize, int* roomsColSize){
int vist[roomsSize];
memset(vist, 0, sizeof(vist)); //将新定义的数组vist数组数据全部置1
num = 0;
dfs(rooms, roomsColSize, vist,0);
return num == roomsSize;
}
函数变量说明:
** room:二维数组表示各个房间内存放的钥匙。
roomSize:表示拥有的房间总个数。
*roomColSize: 表示每个房间拥有的钥匙数。
总结
深度优先重点代码分析:
void dfs(int** rooms, int* roomsColSize, int* vist, int x){
vist[x] = true; //遍历过了的房间置1表示已经走过了
......
......
for(int i = 0; i < roomsColSize[x]; i++){
if(!vist[rooms[x][i]]){ //判断房间是否已经走过
dfs(rooms, roomsColSize, vist, rooms[x][i]);
}
}
}
分析:
vist数组:用于记录该节点是否已经走过。
roomColSize:表示这个节点有多少分支。
x:递归重要参数,将节点传达下一个。
广度优先搜索 (BFS)
解释:一层一层进行遍历
和深度优先例题相同
解题如下:
bool canVisitAllRooms(int** rooms, int roomsSize, int* roomsColSize){
int vis[roomsSize], temp[roomsSize]; //vis数组用于记录该房间是否已经遍历过,temp数组用于存放每一层,节点读出的数值。
memset(vis, 0, sizeof(vis));
int left = 0, right = 1; //left表示当前正在遍历的节点位置(这个位置在temp数组中的左边)temp存入的右边。
temp[0] = 0; //temp = 0,表示第一次进入的是零号房间
vis[0] = true; //表示0号房间已经遍历过了
int x,num = 0;
while(left < right){ //当left == right表示已经遍历完了所有能够遍历的房间
x = temp[left++]; //x 为进入下一个节点。
num++;
for(int i = 0;i < roomsColSize[x];i++){ //这个for循环在作用是将该节点的下一层数据全部录入temp这个数组当中。
if(!vis[rooms[x][i]]){
vis[rooms[x][i]] = true;
temp[right++] = rooms[x][i];
}
}
}
return num==roomsSize;
}
概要:
- 和深度优先一样需要有一个数组用来记录该节点是否已经访问过。
- 需要有一个数组,用来存放每个节点下一层读出的数据,以便进行下一次访问;
- 重点代码:
while(left < right){ //当left == right表示已经遍历完了所有能够遍历的房间
x = temp[left++]; //x 为进入下一个节点。
num++;
for(int i = 0;i < roomsColSize[x];i++){ //这个for循环在作用是将该节点的下一层数据全部录入temp这个数组当中。
if(!vis[rooms[x][i]]){
vis[rooms[x][i]] = true;
temp[right++] = rooms[x][i];
}
}
}
图片来源:极客大学,算法课。