hdu2952Counting Sheep

Problem Description

A while ago I had trouble sleeping. I used to lie awake, staring at the ceiling, for hours and hours. Then one day my grandmother suggested I tried counting sheep after I‘d gone to bed. As always when my grandmother suggests things, I decided to try it out. The only problem was, there were no sheep around to be counted when I went to bed.

Creative as I am, that wasn‘t going to stop me. I sat down and wrote a computer program that made a grid of characters, where # represents a sheep, while . is grass (or whatever you like, just not sheep). To make the counting a little more interesting, I also decided I wanted to count flocks of sheep instead of single sheep. Two sheep are in the same flock if they share a common side (up, down, right or left). Also, if sheep A is in the same flock as sheep B, and sheep B is in the same flock as sheep C, then sheeps A and C are in the same flock.

Now, I‘ve got a new problem. Though counting these sheep actually helps me fall asleep, I find that it is extremely boring. To solve this, I‘ve decided I need another computer program that does the counting for me. Then I‘ll be able to just start both these programs before I go to bed, and I‘ll sleep tight until the morning without any disturbances. I need you to write this program for me.

Input

The first line of input contains a single number T, the number of test cases to follow.

Each test case begins with a line containing two numbers, H and W, the height and width of the sheep grid. Then follows H lines, each containing W characters (either # or .), describing that part of the grid.

Output

For each test case, output a line containing a single number, the amount of sheep flock son that grid according to the rules stated in the problem description.

Notes and Constraints
0 < T <= 100
0 < H,W <= 100

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>

using namespace std;

bool mp[110][110];
char s[110];
bool visit[110][110];
int q[11000][2],l,r;
int d1[] = {1,-1,0,0};
int d2[] = {0,0,1,-1};

void bfs(int a,int b)
{
    l = r = 0;
    visit[a][b] = 1;
    q[r][0] = a,q[r++][1] = b;
    while(l<r)
    {
        int x = q[l][0],y = q[l++][1];
        for(int j = 0;j<4;j++)
        {
            int xx = x+d1[j],yy = y+d2[j];
            if(mp[xx][yy]&&!visit[xx][yy])
            {
                visit[xx][yy] = 1;
                q[r][0] = xx,q[r++][1] = yy;
            }
        }
    }
}

int main()
{
    int z,n,m,i,j,k;
    cin>>z;
    while(z--)
    {
        cin>>n>>m;
        memset(mp,0,sizeof(mp));
        memset(visit,0,sizeof(visit));
        for(i = 1;i<=n;i++)
        {
            scanf("%s",s);
            for(j = 0;j<m;j++)
            {
                mp[i][j+1] = (s[j] == ‘#‘)?1:0;
            }
        }
        int ans = 0;
        for(i = 1;i<=n;i++)
        {
            for(j = 1;j<=m;j++)
            {
                if(!visit[i][j]&&mp[i][j]) ans++,bfs(i,j);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
时间: 2024-08-09 23:50:47

hdu2952Counting Sheep的相关文章

Funny Sheep(思维)

Problem 1606 - Funny Sheep Time Limit: 1000MS   Memory Limit: 65536KB    Total Submit: 612  Accepted: 169  Special Judge: No Description There are N+1 rows and M+1 columns fence with N*M grids on the grassland. Each grid has a sheep. In order to let

hdu 2952 Counting Sheep

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2952 Counting Sheep Description A while ago I had trouble sleeping. I used to lie awake, staring at the ceiling, for hours and hours. Then one day my grandmother suggested I tried counting sheep after I'

Count the Sheep 二分图+思维

Count the Sheep 题意: 问题描述 开学翘课固然快乐,然而也有让呃喵抓狂的事,那当然就是考试了!这可急坏了既要翘课又想要打BC还要准备考试的呃喵. 呃喵为了准备考试没有时间刷题,想打BC又不想跌分,只得求助于BCround92的出题人snowy_smile,让他说点什么 ~~>_<~~. snowy_smile实在没有办法,但是又不好意思透题,只好告诉呃喵,当务之急是好好休息. "如果你按照下面这个办法睡着,那么第二天就绝对不会在BC的赛场上跌分-- 想象一片一望无际.

WHU1606 Funny Sheep 思维

Description There are N+1 rows and M+1 columns fence with N*M grids on the grassland. Each grid has a sheep. In order to let the sheep together, we need to dismantle the fence. Every time you can remove a row or a column of fences. What’s the least n

HDOJ 2952 Counting Sheep

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2952 Counting Sheep Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2231    Accepted Submission(s): 1474 Problem Description A while ago I had tro

HDUJ 2952 Counting Sheep 搜索

Counting Sheep Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2039    Accepted Submission(s): 1342 Problem Description A while ago I had trouble sleeping. I used to lie awake, staring at the c

Pleasant sheep and big big wolf

点击打开链接 题目:在一个N * M 的矩阵草原上,分布着羊和狼,每个格子只能存在0或1只动物.现在要用栅栏将所有的狼和羊分开,问怎么放,栅栏数放的最少,求出个数? 解析:将狼群看作一个集合,羊群看作一个集合.然后设置源点和汇点,将两点至存在动物的点的距离赋值为1,构图,由于求得是栅栏数,从存在动物的位置向四周发散点赋值为1,即该方向放置一个栅栏.然后可以发现变成了求最小割,即求出最大流.需要注意的是,由于数据比较大,200 * 200.如果设置源点和汇点相差较大(即s = 0,e = n *

HDU 3046Pleasant sheep and big big wolf(网络流之最小割)

题目地址:HDU 3046 最小割第一发!其实也没什么发不发的...最小割==最大流.. 入门题,但是第一次入手最小割连入门题都完全没思路...sad..对最小割的本质还是了解的不太清楚.. 这题就是对每两个相邻的格子的边界都要进行加边,然后求最大流就OK了. RE了好长时间,注意遍历加边的时候要从1开始,而不是0开始,因为0是源点的...(也许只有我才犯这种错误吧...)建图不多说了..只要了解了最小割,建图还是很容易想的. 代码如下: #include <iostream> #includ

【DFS深搜初步】HDOJ-2952 Counting Sheep、NYOJ-27 水池数目

[题目链接:HDOJ-2952] Counting Sheep Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2476    Accepted Submission(s): 1621 Problem Description A while ago I had trouble sleeping. I used to lie awake,