1011

来源:互联网 发布:smartdraw mac 破解版 编辑:程序博客网 时间:2024/06/05 06:26

题意:如果相邻的两个小油田,那么它们是同一油田的一部分。石油资源可能很大,可能包含众多的小油田。确定有多少不同的油田都包含在一个网格,探索油田的数量,用@表示存在油田,*表示不存在油田,如果两个油田相邻,则将这两个看成一个油田,计算油田的数量


思路:显然这道题是用深度优先搜索算法进行解答,建一个标记数组和一个保存油田信息的数组,创建完以后使用深度优先搜索算法,每次访问完成后进行标记,以防止重复搜索,得到最终答案截止



    #include <iostream>  
    #include <cstdio>  
    #include <cstring>  
      
    using namespace std;  
    const int maxn = 200;  
      
    char dep[maxn][maxn];  
    int id[maxn][maxn];
    int row, col;  
      
    void dfs(int r, int c, int num) {  
        if(r >= row || r < 0 || c >= col || c < 0)  return;      
        if(dep[r][c] != '@' || id[r][c] != 0)   return;   
        id[r][c] = num;  
      
        for(int i = -1; i <= 1; i++)  
            for(int j = -1; j <= 1; j++)  
                if(i != 0 || j != 0)    dfs(r + i, c + j, num);      
    }  
      
    int main()  
    {  
        while(scanf("%d%d", &row, &col) == 2 && row && col) {  
            for(int i = 0; i < row; i++)  
                scanf("%s", dep[i]);  
      
            int num = 0;  
            memset(id, 0, sizeof(id));  
            for(int i = 0; i < row; i++)  
            for(int j = 0; j < col; j ++) {  
                if(id[i][j] == 0 && dep[i][j] == '@')   dfs(i, j, ++num);  
            }  
            printf("%d\n", num);  
        }  
        return 0;  
    } 

0 0