深度优先搜索算法(Depth First Search):英文缩写为
DFS,是一种用于搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。深度优先搜索采用了回溯思想,该算法沿着树的深度遍历树的节点,会尽可能深的搜索树的分支。
- 回溯:会搜出每一种可能的路线(求路径,通常N<20)
- 不回溯:会搜出每一个能走的点(求能否到达)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| char mp[N][N]; bool mp[N][N]; int dir[4][2] = { 0, 1, 0, -1, 1, 0, -1, 0 }
void dfs(int x, int y) { if (x, y) 是终点 { return; }
vis[x][y] = true; for(int i = 0; i < 4; i++) { int nx = x + dir[i][0]; int ny = y + dir[i][1]; if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue; if(mp[nx][ny] 是障碍 || vis[nx][ny]) continue; dfs(nx, ny); } vis[x][y] = false; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| int path[N * N][2]; int pathsize;
void dfs(int x, int y) { if 终点 { for(int i = 0; i < pathsize; i++) { printf("(%d, %d)->", path[i][0], path[i][1]); } cout << 终点 << endl; } vis[x][y] = true; path[pathsize][0] = x; path[pathsize++][1] = y; for() 搜索下一个点 vis[x][y] = false; pathsize--; }
|
对于连通块问题,可以在main函数中遍历地图,遇到能构成连通块的符号即可进入dfs,对于进入dfs的点,将其设置为不可构成连通块的符号,并不断搜索其周边连通的符号。在main函数中每次进入dfs相当于遇到一个新的连通块并标记,可以进行计数。