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;
}

第一次写时,忘记写自己走过的点不能再走的条件了。

posted @ 2017-10-10 09:27  哲贤  阅读(132)  评论(0编辑  收藏  举报