NC23974. 相聚
描述
输入描述
第一行一个正整数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; }