BFSとDFSの簡単な応用(二)


BFSとDFSの簡単な応用(二)
説明
キャンパスにはいくつかの小川といくつかの湖があります.今、私たちはそれらを池と見なしています.もし私たちの学校のどこかの地図があるとしたら、この地図にはここが池かどうかしか表示されていません.今、あなたの任務が来ました.コンピュータでこの地図にはいくつかの池があります.
入力
1行目は整数Nを入力し、N組のテストデータがあることを示す.
各グループのデータは、まず地図の行数m(0しゅつりょく
この地図の池の数を出力します.
各プールの横(上下左右4箇所)がプールであれば同じプールと見なすことに注意しましょう.
サンプル入力
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

サンプル出力
2
3

ACコード:
#include<cstdio>
#define N 102
#define M 102

int map[N][M];

void search(int i,int j)
{
	if(map[i][j-1])
	{
		map[i][j-1]=0;
		search(i,j-1);
	}
	if(map[i][j+1])
	{
		map[i][j+1]=0;
		search(i,j+1);
	}
	if(map[i-1][j])
	{
		map[i-1][j]=0;
		search(i-1,j);
	}
	if(map[i+1][j])
	{
		map[i+1][j]=0;
		search(i+1,j);
	}
}

int main(int argc,char *argv[])
{
	int t,n,m;
	int i,j,count;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		count=0;
		for(i=1;i<=n;i++)
			for(j=1;j<=m;j++)
				scanf("%d",&map[i][j]);
		for(i=1;i<=n;i++)
			for(j=1;j<=m;j++)
				if(map[i][j])
				{
					count++;
					map[i][j]=0;
					search(i,j);
				}
		printf("%d
",count); } return 0; }