标签:目标 iostream pre .com 二维数组 res 要求 turn family
|基本思路
深度优先遍历图的方法是,从图中某顶点v出发:
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。
|伪代码
1 void dfs(状态) { 2 if 状态 是 目标状态 3 then dosomething 4 else 5 for(每个新状态){ 6 if 新状态合法 7 dfs(新状态) 8 } 9 }
|最简单的例子
为了规划城市,需要统计房屋数目信息。方法如下,一张航拍照片会被分隔为M*N个小格子,用数字0或1分别表示某格子看到的是空地还是屋顶,相邻的屋顶属于同一栋房子,位于对角线上的屋顶不属于同一栋房子(这也符合实际),现在先输入航拍照片的大小(M行N列),再输入矩形俯视图的布局,要求我们输出这块矩形空地中有多少栋房子
测试用例:
0 0 0 0 0
0 1 1 0 0
0 0 1 1 0
0 0 0 1 0
0 0 1 0 0
输出:2
#include <iostream> #include<stdlib.h> int grid[5][5] = { {0,0,0,0,0},{0,1,1,0,0},{0,0,1,1,0},{0,0,1,0,0},{0,0,0,0,1} }; int m = 5, n = 5; void dfs(int i, int j) { if (i<0 || i>m - 1 || j<0 || j>n - 1 || grid[i][j] == 0) return; grid[i][j] = 0;//置0 dfs(i, j + 1); dfs(i, j - 1); dfs(i + 1, j); dfs(i - 1, j); } int gridsearch() { int res = 0; // 遍历m*n的二维数组 for (int i = 0; i<m; i++) { for (int j = 0; j<n; j++) { if (grid[i][j]) { res++; dfs(i, j); } } } return res; } int main() { cout << gridsearch() << endl; system("pause"); return 0; }
转载我认为其他博主的好文章,文章也借(mo)用(gai)了他们的代码:
https://www.cnblogs.com/lawlietfans/p/6849997.html
https://blog.csdn.net/pihe7623/article/details/79768324
标签:目标 iostream pre .com 二维数组 res 要求 turn family
原文地址:https://www.cnblogs.com/huanyue/p/9165082.html