在岛屿 A 所占据的格子中,如果可以从中选出 k 个不同的格子,使得他们的坐标能够组成一个这样的排列:(x0,y0),(x1,y1),...,(xk−1,yk−1),其中 (x(i+1)%k,y(i+1)%k) 是由 (xi,yi) 通过上/下/左/右移动一次得来的 (0≤i≤k−1),此时这 k 个格子就构成了一个"环"。
如果另一个岛屿 B 所占据的格子全部位于这个"环"内部,此时我们将岛屿 B 视作是岛屿 A 的子岛屿。
若 B 是 A 的子岛屿,C 又是 B 的子岛屿,那 C 也是 A 的子岛屿。
请问这个地图上共有多少个岛屿?在进行统计时不需要统计子岛屿的数目。
输入格式
第一行一个整数 T,表示有 T 组测试数据。
接下来输入 T 组数据。
对于每组数据,第一行包含两个用空格分隔的整数 M、N 表示地图大小;接下来输入 M 行,每行包含 N 个字符,字符只可能是 0 或 1。
#include<bits/stdc++.h> usingnamespace std; typedef pair<int,int> pii; int n,m,ans; constint N=55; int a[N][N]; bool sea[N][N],load[N][N];// sea 标记海洋是否访问过,load 标记陆地是否访问过 int dx[8]={-1,0,1,0,-1,-1,1,1};// 8个方向 //上,左,下,右,左上,右上,右下,左下 int dy[8]={0,-1,0,1,-1,1,1,-1}; int ddx[4]={-1,0,1,0};// 4个方向 //上,左,下,右 int ddy[4]={0,-1,0,1};