zoukankan      html  css  js  c++  java
  • 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'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

    Sample Input

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

    Sample Output

    6
    3

    dfs求连通块个数。。

     1 #include<algorithm>
     2 #include<iostream>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<vector>
     7 #include<map>
     8 using std::cin;
     9 using std::cout;
    10 using std::endl;
    11 using std::find;
    12 using std::sort;
    13 using std::map;
    14 using std::pair;
    15 using std::vector;
    16 using std::multimap;
    17 #define pb(e) push_back(e)
    18 #define sz(c) (int)(c).size()
    19 #define mp(a, b) make_pair(a, b)
    20 #define all(c) (c).begin(), (c).end()
    21 #define iter(c) decltype((c).begin())
    22 #define cls(arr,val) memset(arr,val,sizeof(arr))
    23 #define cpresent(c, e) (find(all(c), (e)) != (c).end())
    24 #define rep(i, n) for (int i = 0; i < (int)(n); i++)
    25 #define tr(c, i) for (iter(c) i = (c).begin(); i != (c).end(); ++i)
    26 const int N = 110;
    27 typedef unsigned long long ull;
    28 char G[N][N];
    29 bool vis[N][N];
    30 int H, W;
    31 const int dx[] = { 0, 0, -1, 1 }, dy[] = { -1, 1, 0, 0 };
    32 void dfs(int x, int y) {
    33     vis[x][y] = true;
    34     rep(i, 4) {
    35         int nx = x + dx[i], ny = y + dy[i];
    36         if (nx < 0 || nx >= H || ny < 0 || ny >= W) continue;
    37         if (vis[nx][ny] || G[nx][ny] == '.') continue;
    38         dfs(nx, ny);
    39     }
    40 }
    41 int main() {
    42 #ifdef LOCAL
    43     freopen("in.txt", "r", stdin);
    44     freopen("out.txt", "w+", stdout);
    45 #endif
    46     int t, ans;
    47     scanf("%d", &t);
    48     while (t--) {
    49         ans = 0;
    50         cls(vis, false);
    51         scanf("%d %d", &H, &W);
    52         rep(i, H) scanf("%s", G[i]);
    53         rep(i, H) {
    54             rep(j, W) {
    55                 if (!vis[i][j] && G[i][j] == '#') ans++, dfs(i, j);
    56             }
    57         }
    58         printf("%d
    ", ans);
    59     }
    60     return 0;
    61 }
    View Code
    By: GadyPu 博客地址:http://www.cnblogs.com/GadyPu/ 转载请说明
  • 相关阅读:
    php 计算两个日期相差天数
    Linux系统查找清理磁盘大文件
    虚拟机重启网络服务失败,当查看状态显示错误Failed to start LSB......
    c++简单编写线性表(实验)
    学校的c++程序课程设计(简单的写法 并无太多c++的特色)
    C语言简单实现链栈基本几个功能
    简单用数组模拟顺序栈(c++)
    详细易懂的二叉树遍历(先中后)
    大数加法之C语言函数法(只有正数版)
    有关Java垃圾回收的几个问题
  • 原文地址:https://www.cnblogs.com/GadyPu/p/4614660.html
Copyright © 2011-2022 走看看