DFS入门之一
深度优先搜索实现较为简单,需要控制两个因素:
1.已经访问过的元素不能再访问,在实际题目中还要加上不能访问的元素(障碍)
2.越界这种情况是不允许的
以杭电的1312 Red and Black 为例, 这是一道典型的DFS题目
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1312
题目大意:'@'代表起始位置, '.' 代表黑点(可以穿越),'#' 代表红点(障碍) 要求统计最多可以覆盖多少个黑点
题目分析:确定起始位置 -> 开始DFS -> 如果不是非法位置,计数一次 -> 递归的搜索四个方向(UP, DOWN, LEFT, RIGHT) ->结束
附上我的代码(仅供参考):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <cstdio> #include <cstring> const int maxn = 50 + 10; char a[maxn][maxn]; int w, h, idx[maxn][maxn], cnt; int dfs(int r, int c, int id) { if(r < 0 || r >= h || c < 0 || c >= w) return 0; if(idx[r][c] > 0 || a[r][c] == '#') return 0; idx[r][c] = id; cnt++; for(int i = -1; i <= 1; i++) for(int j = -1; j <= 1; j++) if((i == 0 && j != 0)||(i != 0 && j == 0)) dfs(r+i, c+j, id); } int main() { int r, c; while(~scanf("%d%d", &w, &h)){ cnt = 0; if(w == 0 && h == 0) break; for(int i = 0; i < h; i++) scanf("%s", a[i]); memset(idx, 0, sizeof(idx)); for(int i = 0; i < h; i++) for(int j = 0; j < w; j++) if(a[i][j] == '@'){ r = i; c = j; } dfs(r, c, 1); printf("%d\n", cnt); } return 0; }