列表

详情


NC23974. 相聚

描述

小猫在研究网格图。
小猫在研究联通性。
给定一张N×M的网格图,只含字符0和1,问1形成的联通块有多少个。
两个1是联通的,当且仅当其中一个位于另一个的上、下、左、右四个方向之一。

输入描述

第一行一个正整数T,表示数据组数。

每组数据的第一行两个正整数N,M,表示矩阵的长和宽。

接下来N行,每行M个字符0或1。

输出描述

T行,每行一个正整数,表示每组数据的答案。

示例1

输入:

2
3 5
10101
01110
10101
3 3
111
010
111

输出:

5
1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang 3.9) 解法, 执行用时: 6ms, 内存消耗: 344K, 提交时间: 2019-05-04 13:53:16

#include<stdio.h>
int n,m;
char a[51][51];
int fx[4]={1,-1,0,0};
int fy[4]={0,0,1,-1};

void dfs(int x,int y)
{
	if(x<0||y<0||x>=n||y>=m||a[x][y]=='0')
	return;
	a[x][y]='0';
	int i;
	for(i=0;i<4;i++)
	dfs(x+fx[i],y+fy[i]);
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		int i,j;
		for(i=0;i<n;i++)scanf("%s",a[i]);
		
		int count=0;
		for(i=0;i<n;i++)
		for(j=0;j<m;j++)
		if(a[i][j]=='1')
		{
			count++;
			dfs(i,j);
		}
		printf("%d\n",count);
	}
	return 0;
}

C++ 解法, 执行用时: 11ms, 内存消耗: 540K, 提交时间: 2021-05-27 14:21:18

#include<bits/stdc++.h>
using namespace std;
char s[60][60];
int n,m,T;
bool dfs(int i,int j)
{
	if(i==-1||j==-1||i==n||j==m||s[i][j]=='0')
		return 0;
	s[i][j]='0';
	dfs(i-1,j);
	dfs(i+1,j);
	dfs(i,j+1);
	dfs(i,j-1);
	return 1;
}
int main()
{
	cin>>T;
	while(T--)
	{
		int i,j,ans=0;
		cin>>n>>m;
		for(i=0;i<n;i++)
			cin>>s[i];
		for(i=0;i<n;i++)
			for(j=0;j<m;j++)
				ans+=dfs(i,j);
		cout<<ans<<endl;
	}
	return 0;
}

上一题