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;
}
原文地址:https://www.cnblogs.com/Staceyacm/p/10781855.html