zoukankan      html  css  js  c++  java
  • GZS与小公园(DFS)

    Description

    某天GZS漫步在学校新建的小公园,他发现那里建成了一些水池和小河道。我们暂且把它们统一看成水池。假设公园旁有一张小公园的地图,上面仅标识了此处是否是水池,你能帮GZS计算出该地图中一共有几个水池吗。

    Input

    第一行输入一个整数N,表示共有N组测试数据 每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池,0表示此处是地面)

    Output

    输出该地图中水池的个数。

    Sample Input 1 

    2
    3 4
    1 0 0 0 
    0 0 1 1
    1 1 1 0
    5 5
    1 1 1 1 0
    0 0 1 0 1
    0 0 0 0 0
    1 1 1 0 0
    0 0 1 1 1
    

    Sample Output 1

    2
    3

    Hint

    要注意,每个水池的旁边(上下左右四个位置)如果还是水池的话的话,它们可以看做是同一个水池。

    Source

    qduoj 第一次月赛 for 2014级

    深搜一下就ok

    代码:

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<iostream>
    
    using namespace std;
    int map[105][105];
    int vis[105][105];
    int l,r;
    int dis[4][2]= {{0,1},{0,-1},{-1,0},{1,0}};
    int dfs(int x,int y) {
    	vis[x][y]=1;
    	for(int t=0; t<4; t++) {
    		int xx=x+dis[t][0];
    		int yy=y+dis[t][1];
    		if(xx>=0&&yy<r&&yy>=0&&xx<l&&map[xx][yy]==1&&vis[xx][yy]==0) {
    			map[xx][yy]=0;
    			dfs(xx,yy);
    		}
    
    	}
    }
    int main() {
    	int n;
    	cin>>n;
    	for(int t=0; t<n; t++) {
    		int sum=0;
    		scanf("%d%d",&l,&r);
    		memset(map,0,sizeof(map));
    		memset(vis,0,sizeof(vis));
    		for(int j=0; j<l; j++) {
    			for(int k=0; k<r; k++) {
    				scanf("%d",&map[j][k]);
    
    			}
    		}
    		for(int j=0; j<l; j++) {
    			for(int k=0; k<r; k++) {
    				if(map[j][k]==1) {
    
    					dfs(j,k);
    					sum++;
    //	   		cout<<j<<" "<<k<<endl;
    				}
    			}
    		}
    
    		printf("%d
    ",sum);
    	}
    
    
    
    
    	return 0;
    }
  • 相关阅读:
    webpy使用笔记(一)
    如何衡量离散程度
    Hash哈希(二)一致性Hash(C++实现)
    Hash哈希(一)
    sqlmap使用笔记
    Windows7 IIS7.5 HTTP Error 503 The service is unavailable 另类解决方案
    [转]IP动态切换脚本
    全国各地电信DNS服务器地址
    比较好的汉字拼音化类
    c#读取INI文件类
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781855.html
Copyright © 2011-2022 走看看