POJ_2386_Lake Counting

来源:互联网 发布:中国近几年进出口数据 编辑:程序博客网 时间:2024/05/01 13:11

POJ 2386

题意:所有连在一起(八方)的W表示一个湖,计算所有的湖。思路:找到一个W后dfs,并把能搜索到的w全部记为已经遍历, 每次dfs时令ans++(湖的个数),最终输出ans即可,这里对W进行dfs时除了边界条件只让其搜索包围它的W.也可以直接bfs。
/*****  DFS*****/#include <iostream>#include <iomanip>#include <cstring>#include <cstdio>#include <cstdlib>#include <cmath>#include <set>#include <map>#include <list>#include <stack>#include <deque>#include <queue>#include <vector>#include <algorithm>#include <functional>#define PI acos(-1.0)#define eps 1e-10#define INF 0x7fffffff#define debug(x) cout << "--------------> " << x << endltypedef long long LL;typedef unsigned long long ULL;using namespace std;char graph[108][108];int vis[108][108];     //是否遍历int n, m, ans;int dx[8] = {1,1,0,-1,-1,-1,0,1}, dy[8] = {0,1,1,1,0,-1,-1,-1};void dfs(int x,int y){     for(int i = 0; i < 8; ++i)     {        int xx = x+dx[i], yy = y+dy[i];        if(xx >=0 && xx < n && yy >= 0 && yy < m)        {                if(graph[xx][yy] == 'W' && !vis[xx][yy])                {                        vis[xx][yy] = 1;                        dfs(xx,yy);                }        }     }}int main(){     memset(vis,0,sizeof(vis));     int ans = 0;     scanf("%d%d",&n,&m);     for(int i = 0; i < n; ++i)     {        scanf("%s",&graph[i]);     }     for(int i = 0;  i < n; ++i)     {             for(int j = 0; j < m; ++j)             {                     if(graph[i][j] == 'W' && !vis[i][j])                     {                             vis[i][j] = 1;                             dfs(i, j);                             ans++;                     }             }     }     printf("%d",ans);     return 0;}
/***** BFS*****/#include <iostream>#include <iomanip>#include <cstring>#include <cstdio>#include <cstdlib>#include <cmath>#include <set>#include <map>#include <list>#include <stack>#include <deque>#include <queue>#include <vector>#include <algorithm>#include <functional>#define debug(x) cout << "--------------> " << x << endlusing namespace std;const double PI = acos(-1.0);const double eps = 1e-10;const long long INF = 0x7fffffff;const long long MOD = 1000000007;const int MAXN = 100 + 7;int n, m;class Point{public:    Point(int a, int b):x(a),y(b){};    int x, y;};char gra[MAXN][MAXN];bool vis[MAXN][MAXN];int dx[] = {0, -1, -1, -1, 0, 1, 1, 1};int dy[] = {1, 1, 0, -1, -1, -1, 0, 1};int ans = 0;bool isValidRoad(int x, int y){    return x >=0 && x < n && y >= 0 && y < m && !vis[x][y];}void BFS(int x, int y){    if(isValidRoad(x, y) && gra[x][y] == 'W')    {        ans++;        vis[x][y] = true;        Point p(x, y);        queue<Point> q;        q.push(p);        while(!q.empty())        {            Point P = q.front();            q.pop();            for(int i = 0; i < 8; ++i)            {                Point PP(P.x + dx[i], P.y + dy[i]);                if(isValidRoad(PP.x , PP.y) && gra[PP.x][PP.y] == 'W')                {                    q.push(PP);                    vis[PP.x][PP.y] = true;                }            }        }    }    return ;}int main(){     memset(gra, 0, sizeof(gra));     memset(vis, false, sizeof(vis));     scanf("%d%d", &n, &m);     for(int i = 0; i < n; ++i)     {         for(int j = 0; j < m; ++j)         {            cin >> gra[i][j];         }     }     for(int i = 0; i < n; ++i)     {         for(int j = 0; j < m; ++j)         {             if(gra[i][j] == 'W' && !vis[i][j])             BFS(i, j);         }     }     printf("%d\n", ans);     return 0;}
0 0
原创粉丝点击