Problem 1011

来源:互联网 发布:网络建设 ppt 编辑:程序博客网 时间:2024/05/18 00:42
简单题意:

探索油田的数量,用@表示存在油田,*表示不存在油田,如果两个油田相邻,则将这两个看成一个油田,计算油田的数量

解题思路:

实际上这几个题的本质都是利用深度优先搜索进行计算油田的数量,建立一个 标记数组,再建立一个数组进行保存油田信息,然后建立一定的规则对数组的每一个数组进行搜索,看是否满足要求,对已经访问过的位置进行标记,以免重复搜索。

编写代码:

#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
原创粉丝点击