Oil Deposits UVA - 572 HDU - 1241(dfs连通块)

https://vjudge.net/problem/UVA-572
https://vjudge.net/problem/HDU-1241

思路:

这俩是一样的,主函数内循环遍历每个块,若该块有油且未标记,ans++并作为起点dfs,将可到达的油田全部标记,输出ans
这里提供两种 八向走法 的代码:

 for(int i=-1;i<=1;i++)
        for(int j=-1;j<=1;j++)
            if(i||j) DFS(x+i,y+j);
int dx[] = {0, 0,1,-1,1, 1,-1,-1};
int dy[] = {1,-1,0, 0,1,-1, 1,-1};
for(int i = 0; i < 8; i++) {
    int mx = x + dx[i];
    int my = y + dy[i];
}

用哪个都可以,以下代码供参考:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include<iomanip>
#include <stack>
#include <queue>
using namespace std;
int dx[] = {0, 0,1,-1,1, 1,-1,-1};
int dy[] = {1,-1,0, 0,1,-1, 1,-1};
bool vis[110][110];
string s[110];
int r, c;
void dfs (int x, int y) {
    vis[x][y] = true;//标记
    for(int i = 0; i < 8; i++) {
        int mx = x + dx[i];
        int my = y + dy[i];
        if(mx>=0 && mx<r && my>=0 &&my<c)
            if(s[mx][my] == '@' && !vis[mx][my]) dfs(mx,my);
    }
}

int main() {

    while(cin>>r>>c && r) {
        int ans = 0;
        memset(vis, 0, sizeof(vis));

        for(int i = 0; i < r; i++) cin >> s[i];

        for(int i = 0; i < r; i++)
            for(int j = 0; j < c; j++)
                if(s[i][j] == '@' && !vis[i][j]) {
                    dfs(i,j); ans++;//此处统计
                }
        cout << ans << endl;
    }
    return 0;
}


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值