HDU-1241-Oil Deposits

HDU-1241-Oil Deposits

题目链接:HDU-1241

题目思路:在一个矩阵里,有些格子是‘@’,有些不是,相邻(上、下、左、右、左上、右上、左下、右下)的格子如果也是‘@’,那么他们属于同一个矿井,问总共有多少个矿井。

题目思路:DFS,求连通块个数。

以下是代码:

#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
string s[101];
int vis[105][105];
int flag = 0;
int m,n;
void dfs(int c,int r)
{
    if (c >= m || c < 0 || r >= n || r < 0) return;
    if (vis[c][r] || s[c][r] != '@') return;
    vis[c][r] = 1;
    if (s[c][r] == '@') flag = 1;
    for (int i = -1; i <= 1; i++)
    {
        for (int j = -1; j <= 1; j++)
        {
            if (i == 0 && j == 0) continue;
            dfs(c + i,r + j);
        }
    }
}
int main(){

    while(cin >> m >> n)
    {
        if (m == 0 && n == 0) break;
        for (int i = 0; i < m; i++)
        {
            cin >> s[i];
        }
        int ans = 0;
        memset(vis,0,sizeof(vis));
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (s[i][j] == '@')
                {
                    dfs(i,j);
                    if (flag) ans++;
                    flag = 0;
                } 

            }
        }
        cout << ans << endl;
    } 
    return 0;
}

你可能感兴趣的:(HDU,DFS,1241)