uva572连通块dfs
原创、转载请注明出处
从图中的每个结点开始搜,一种连通块一个id号。实际上,一个连通块被其中的一个结点搜过,连通块内的其他结点就不能再搜。
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
int graph[105][105];
int m,n;
void dfs(int i, int j, int id)
{
if(i < 0 || i >= m || j < 0 || j >= n || graph[i][j] == 0 || graph[i][j] == id)
{
return;
}
graph[i][j] = id;
dfs(i-1, j, id);
dfs(i+1, j, id);
dfs(i, j-1, id);
dfs(i, j+1, id);
dfs(i-1, j-1, id);
dfs(i-1, j+1, id);
dfs(i+1, j-1, id);
dfs(i+1, j+1, id);
}
int main()
{
while(cin >> m >> n && m && n)
{
for(int i = 0; i < m; i ++)
{
for(int j = 0; j < n; j ++)
{
char ch;
cin >> ch;
if(ch == '@')
{
graph[i][j] = 1;
}
else
{
graph[i][j] = 0;
}
}
}
int id = 2;
for(int i = 0; i < m; i ++)
{
for(int j = 0; j < n; j ++)
{
if(graph[i][j] == 1)
{
dfs(i,j,id);
id ++;
}
}
}
cout << id-2 << endl;
}
return 0;
}
第一次写时,忘记写自己走过的点不能再走的条件了。