例题链接=>UVA572
图论之DFS,一向是惧怕图论的,所以一直没贴过关于图的代码。
时间复杂度O(m*n),其中m, n 为邻接矩阵的行数和列数,下面代码中的dfs()函数用于找无向图中的连通连通分支数。
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>
const int maxn = 100 + 5;
char pic[maxn][maxn];
int m, n, idx[maxn][maxn];
void dfs(int r, int c, int id) {
if (r < 0 || r >= m || c < 0 || c >= n)
return;//格子出界
if (idx[r][c] > 0 || pic[r][c] != '@')
return; //不是'@'格子,或者已经访问过的格子
idx[r][c] = id;//连通分量编号
for (int dr = -1; dr <= 1; dr++)
for (int dc = -1; dc <= 1; dc++)
if (dr != 0 || dc != 0)
dfs(r + dr, c + dc, id);
}
int main() {
while (~scanf("%d%d", &m, &n) && m && n) {
for (int i = 0; i < m; ++i)
scanf("%s", pic[i]);
memset(idx, 0, sizeof(idx));
int cnt = 0;
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j)
if (idx[i][j] == 0 && pic[i][j] == '@')
dfs(i, j, ++cnt);
printf("%d\n", cnt);
}
return 0;
}
The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits.GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that dividesthe land into numerous square plots. It then analyzes each plot separately, using sensing equipment todetermine whether or not the plot contains oil.A plot containing oil is called a pocket. If two pockets are adjacent, then they are part of thesame oil deposit. Oil deposits can be quite large and may contain numerous pockets. Your job is todetermine how many different oil deposits are contained in a grid.InputThe input file contains one or more grids. Each grid begins with a line containing m and n, the numberof rows and columns in the grid, separated by a single space. If m = 0 it signals the end of the input;otherwise 1 ≤ m ≤ 100 and 1 ≤ n ≤ 100. Following this are m lines of n characters each (not countingthe end-of-line characters). Each character corresponds to one plot, and is either ‘*’, representing theabsence of oil, or ‘@’, representing an oil pocket.OutputFor each grid, output the number of distinct oil deposits. Two different pockets are part of the sameoil deposit if they are adjacent horizontally, vertically, or diagonally. An oil deposit will not containmore than 100 pockets.
Sample Input
1 1
*
\
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
\
****@
*@@*@
*@**@
@@@*@
@@**@
\
0 0
Sample Output0122\