TZOJ 2799:数羊 深搜


描述

前段时间我失眠了。我曾经躺着醒着,盯着天花板,好几个小时。有一天,我的祖母建议我在睡觉后试着数羊。像往常一样,当我的祖母提出建议时,我决定尝试一下。唯一的问题是,当我上床睡觉时,周围没有羊可以数。

尽管我很有创意,但这不会阻止我。我坐下来编写了一个计算机程序,它制作了一个字符网格,其中 # 代表一只羊,而 . 是草(或任何你喜欢的东西,只是不是羊)。为了让计数更有趣,我还决定要数羊群而不是单只羊。如果两只羊有共同的一面(上、下、右或左),则它们属于同一个羊群。另外,如果羊 A 和羊 B 在同一个羊群中,羊 B 和羊 C 在同一个羊群中,那么羊 A 和羊 C 在同一个羊群中。


现在,我遇到了一个新问题。虽然数这些羊实际上可以帮助我入睡,但我发现它非常无聊。为了解决这个问题,我决定我需要另一个计算机程序来为我计算。然后我就可以在睡觉前启动这两个程序,并且我会一直睡到早上,没有任何干扰。我需要你为我编写这个程序。

输入

输入的第一行包含一个数字 T,即要遵循的测试用例的数量。

每个测试用例都以包含两个数字 H 和 W 的行开始,即羊网格的高度和宽度。然后是 H 行,每行包含 W 个字符(# 或 .),描述网格的该部分。

输出

对于每个测试用例,输出一行包含单个数字,即根据问题描述中所述的规则网格表示的羊群数量。

注释和约束
0 < T <= 100
0 < H,W <= 100

样例输入

 

2
4 4
#.#.
.#.#
#.##
.#.#
3 5
###.#
..#..
#.###

样例输出

6
3

#include
using namespace std;
int n,m,ans,sum,f,maxx;
char a[101][101];//地图 
bool book[101][101];//标记数组 
int nex[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//方向 
void dfs(int x,int y)
{
    int tx,ty;
    for(int i=0;i<4;i++)
    {
        tx = nex[i][0]+x;
        ty = nex[i][1]+y;
        if(tx<1||tx>n||ty<1||ty>m)continue;//是否越界 
        if(a[tx][ty]=='#'&&book[tx][ty]==0)//判断下一步是否可走 
        {
            book[tx][ty]=1;//标记已走 
            dfs(tx,ty);//继续搜 
        }
    }
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(book,0,sizeof(book));//情况标记数组 
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>a[i][j];
            }
            getchar();//吃掉回车 
        }
        ans = 0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(a[i][j]=='#'&&book[i][j]==0)//如果是#号并且没有标记过 
                {
                    book[i][j]=1;//标记走过 
                    ans++;//羊群+1 
                    dfs(i,j);
                }
            }
        }
        cout<endl;
    }
    
    return 0;
}