#include <bits/stdc++.h>
using namespace std;
using ll = long long;
typedef pair<int,int> PII;
const int N = 101;
int g[N][N];//存储地图
int n,m;//长和宽
int ans;
bool sea_b[N][N];
bool road_b[N][N];
//陆地的方向向量
int ddx[4]={1,0,-1,0};
int ddy[4]={0,1,0,-1};
//海水的方向向量
int dx[8]={-1, -1, -1, 0, 1, 1, 1, 0};
int dy[8]={-1, 0, 1, 1, 1, 0, -1, -1};
bool check(int x, int y)
{
//检查是否超过地图的边界
return(x >= 0 && x < n && y >= 0 && y < m);
}
void road_bfs(int x , int y)
{
queue<PII> q;
road_b[x][y]=true;
q.push({x,y});
while(q.size())
{
auto t = q.front();
q.pop();
for(int i = 0 ;i < 4 ; i ++)
{
int nx = t.first + ddx[i];
int ny = t.second + ddy[i];
if(check(nx,ny) && g[nx][ny] && !road_b[nx][ny])
{
road_b[nx][ny] = true;
q.push({nx, ny});
}
}
}
}
void sea_bfs(int x , int y)
{
queue<PII> q;
sea_b[x][y] = true;
q.push({x,y});
while(q.size())
{
auto t = q.front();
q.pop();
for(int i = 0; i < 8; i++)
{
int nx = t.first + dx[i];
int ny = t.second + dy[i];
if(check(nx,ny) && !g[nx][ny] && !sea_b[nx][ny])
{
sea_b[nx][ny] = true;
q.push({nx,ny});
}
if(check(nx,ny) && g[nx][ny] && !road_b[nx][ny])
{
ans ++;
road_bfs(nx,ny);
}
}
}
}
void solve()
{
cin >> n >> m;
ans = 0;
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < n; j ++)
{
sea_b[i][j]=road_b[i][j]=false;
}
}
for(int i = 0; i < n; i++)
{
string s; cin >> s;
for(int j = 0; j < m; j++)
{
g[i][j] = s[j] - '0';
}
}
bool flag = false;
for(int i = 0;i < n; i++)
{
for(int j = 0 ;j < m; j++)
{
if(i == 0 || i == n - 1 || j == 0 || j == m - 1)
{
if(sea_b[i][j] == false && g[i][j] == 0)
{
flag = true;
sea_bfs(i,j);
}
}
}
}
if(!flag)
ans = 1;
cout << ans << endl;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _;cin >> _;
while(_--)solve();
return 0;
}
对外圈的海进行BFS搜索,搜索到一个岛屿之后,对岛屿进行标记进行BFS搜索,将其这一个外岛全部标记为1,做到不重不漏,如果外圈无海的话为特殊情况,此时是一个大环岛,无论里边是否存在一个环岛,依据题意答案都为1。