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


















发布了54 篇原创文章 · 获赞 43 · 访问量 1963

猜你喜欢

转载自blog.csdn.net/Jungle_st/article/details/104625871
今日推荐