#include<iostream> #include<stack> #include<cstring> #include<algorithm> #include<string> using namespace std; const int maxn=55; const int dir=4; char map[maxn][maxn];//出错:字符1 int m,n; int vis[maxn][maxn]; int x_[dir]={-1,1,0,0}; int y_[dir]={0,0,-1,1}; bool check(int x,int y)//对当前点的边界检查 { if(x>=m||x<0||y>=n||y<0) return false; else return true; } void dfs(int x,int y) { vis[x][y]=1; for(int i=0;i<dir;i++) { int new_x=x+x_[i]; int new_y=y+y_[i]; //对0的检查也可纳入check if(map[new_x][new_y]=='1'&&vis[new_x][new_y]==0&&check(new_x, new_y)) //先看1最快,减少判断 { dfs(new_x,new_y);//到头会退出来..再Gio } } } int main() { int t; cin>>t; while(t--) { memset(vis,0,sizeof(vis)); cin>>m>>n; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { cin>>map[i][j]; } } int cnt=0; for(int i=0;i<m;i++) { for(int j=0;j<n;j++)//j<n写成i<n { if(map[i][j]=='1'&&vis[i][j]==0) { dfs(i,j); cnt++; } } } cout<<cnt<<endl; } return 0; }