#include<stdio.h>
int n;
int map[101][101];
int row, col;
int der[4][2]={{0, 1},{1, 0},{0 , -1},{-1, 0}};//用二维数组记录四个方向
void count(int x, int y)
{
int i;
int x1,y1 ;
map[x][y] = 0;//可以走到即置零
//else
//{
for(i = 0; i < 4; i ++)
{
x1 = x;//可以不改变当前坐标,进入下一个点
y1 = y;
x1 += der[i][0];//妙!!!!!
y1 += der[i][1];
if(x1 < 0 || y1 < 0 || x1 == row || y1 == col)
continue;
else{
if(map[x1][y1] == 1)
count(x1, y1);
}
}
//}
}
int main ()
{
int i, j;
int N;
scanf("%d", &N);
getchar();
while(N --){
scanf("%d%d",&row,&col);
getchar();
for(i = 0 ; i < row; i ++)
for(j = 0 ; j < col; j ++)//这能这样初始化,不然会第一行 100 列 全部输入完再走下一行
{
scanf("%d",&map[i][j]);//初始化地图
getchar();
}
for(i = 0 ; i < row; i ++)
for(j = 0 ; j < col; j ++)//判断不为0 的点
{
if(map[i][j] == 1)//一条路径走完,那一片都被标记为 0,下次不会被找到
{
n++;
count(i, j);
}
}
printf("%d\n",n);
n = 0;
}
return 0;
}
思路:以一个点为基准,这个点所能走到的所有的点 构成的一片都当成1个水池 , 即一个点所能走过的路径就是 一片
我们只需要记录我走了一次路 就好
为了便于查找点,和判断点,我们采用 遇到 水池 ,水池数目加一,而走过的路 标记为0 的方法