Oil Deposits HDU

来源:互联网 发布:深圳市市政院 知乎 编辑:程序博客网 时间:2024/06/06 02:41

通过DFS或者BFS分块,求有几块区域,需要注意的是与当前点相邻的有 上下左右 左上左下 右上右下 八个,其他的都没什么难度

//leehaoze#include <iostream>#include <deque>#include <string>#include <vector>#include <queue>#include <cstdio>#include <stack>#include <algorithm>#include <cstring>#include <cctype>#include <cstdio>#include <cmath>#include <cstdlib>using namespace std;const int INF = 1<<29;#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )#define ULL unsigned long long#define MAXN (100 + 5)struct Point{    Point(int x,int y):x_(x),y_(y){}    int x_,y_;};int Move_X[] = {0, 0, 1,-1,-1,-1, 1, 1};int Move_Y[] = {1,-1, 0, 0,-1, 1,-1, 1};char map[MAXN][MAXN];bool visit[MAXN][MAXN];int m,n;bool Input(){    cin >> m >> n;    if(m == 0 && n == 0)return false;    for (int i = 0; i < m; ++i) {        for (int j = 0; j < n; ++j) {            cin >> map[i][j];            visit[i][j] = false;        }    }    return true;}bool Legal(int dx,int dy){    return dx >= 0 && dx < m && dy >= 0 && dy < n && !visit[dx][dy] && map[dx][dy] == '@';}void DFS(Point start){    for (int i = 0; i < 8; ++i) {        int dx = start.x_ + Move_X[i];        int dy = start.y_ + Move_Y[i];        if(Legal(dx,dy)){            visit[dx][dy] = true;            DFS(Point(dx,dy));        }    }}int main() {#ifdef LOCAL    freopen("IN.txt", "r", stdin);#endif    std::ios::sync_with_stdio(false);    while(Input()){        int ans = 0;        for (int i = 0; i < m; ++i) {            for (int j = 0; j < n; ++j) {                if(map[i][j] == '@' && !visit[i][j]){                    DFS(Point(i,j));                    ++ans;                }            }        }        cout << ans << endl;    }}
0 0
原创粉丝点击