zoukankan      html  css  js  c++  java
  • POJ 2386 Lake Counting(搜索联通块)

    Lake Counting
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 48370   Accepted: 23775

    Description

    Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water ('W') or dry land ('.'). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors. 

    Given a diagram of Farmer John's field, determine how many ponds he has.

    Input

    * Line 1: Two space-separated integers: N and M 

    * Lines 2..N+1: M characters per line representing one row of Farmer John's field. Each character is either 'W' or '.'. The characters do not have spaces between them.

    Output

    * Line 1: The number of ponds in Farmer John's field.

    Sample Input

    10 12
    W........WW.
    .WWW.....WWW
    ....WW...WW.
    .........WW.
    .........W..
    ..W......W..
    .W.W.....WW.
    W.W.W.....W.
    .W.W......W.
    ..W.......W.

    Sample Output

    3

    Hint

    OUTPUT DETAILS: 

    There are three ponds: one in the upper left, one in the lower left,and one along the right side.

    Source

    【题意】

    对于一个图,八个方向代表相邻,求出相邻的(联通)块的个数

     

    【分析】


    以一个点W为入口将相邻的W 深搜一遍,同时将他改掉,避免重搜

     

    【代码】

    #include<cstdio>
    using namespace std;
    const int N=105;
    int n,m,ans,dir[8][2]={{0,1},{0,-1},{1,0},{-1,0},{-1,-1},{1,-1},{1,1},{-1,1}};
    char mp[N][N];
    void dfs(int x,int y){
    	mp[x][y]='.';
    	for(int i=0;i<8;i++){
    		int nx=x+dir[i][0];
    		int ny=y+dir[i][1];
    		if(nx<1||ny<1||nx>n||ny>m||mp[nx][ny]=='.') continue;
    		dfs(nx,ny);
    	}
    }
    inline void Init(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++) scanf("%s",mp[i]+1);
    }
    inline void Solve(){
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			if(mp[i][j]=='W'){
    				dfs(i,j);
    				ans++;
    			}
    		}
    	}
    	printf("%d",ans);
    }
    int main(){
    	Init();
    	Solve();
    	return 0;
    } 
     


     

     

  • 相关阅读:
    前端开发者应该知道的 CSS 小技巧
    css3制作六边形图片
    css3 绘制优惠券
    flex css 布局
    js 微信分享
    JS判断移动设备最佳方法 并实现跳转至手机版网页
    ajax 提交成功页面跳转问题
    css相关tips
    无阻塞加载和defer、async
    常用排序算法
  • 原文地址:https://www.cnblogs.com/shenben/p/10353174.html
Copyright © 2011-2022 走看看