• 数据结构——HDU1312:Red and Black(DFS)


    题目描述

    There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't move on red tiles, he can move only on black tiles.

    Write a program to count the number of black tiles which he can reach by repeating the moves described above.

    输入

    The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.

    There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.

    '.' - a black tile
    '#' - a red tile
    '@' - a man on a black tile(appears exactly once in a data set)
    The end of the input is indicated by a line consisting of two zeros.

    Output

    For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).

    Sample Input

    6 9
    ....#.
    .....#
    ......
    ......
    ......
    ......
    ......
    #@...#
    .#..#.
    11 9
    .#.........
    .#.#######.
    .#.#.....#.
    .#.#.###.#.
    .#.#..@#.#.
    .#.#####.#.
    .#.......#.
    .#########.
    ...........
    11 6
    ..#..#..#..
    ..#..#..#..
    ..#..#..###
    ..#..#..#@.
    ..#..#..#..
    ..#..#..#..
    7 7
    ..#.#..
    ..#.#..
    ###.###
    ...@...
    ###.###
    ..#.#..
    ..#.#..
    0 0

    Sample Output

    45
    59
    6
    13

    解题思路:
    深搜的方法解决,题目意思就是从@开始找.并与@连通,碰到#等于碰到了墙,题目很简单,@可以向四个方向上、下、左、右走,所以 用四个坐标标记出来,然后,再一一遍历,递归调用寻找,用一个30*30的数组标识此点有没有走过,避免走重复

    程序代码:
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int n,m,cot;
    char map[30][30];
    int to[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
    
    void dfs(int i,int j)
    {
        cot++;
        map[i][j] = '#';
        for(int k = 0; k<4; k++)
        {
            int x = i+to[k][0];
            int y = j+to[k][1];
            if(x<n && y<m && x>=0 && y>=0 && map[x][y] == '.')
                dfs(x,y);
        }
        return;
    }
    
    int main()
    {
        int i,j,fi,fj;
        while(~scanf("%d%d%*c",&m,&n)&&m&&n)
        {
            for(i = 0; i<n; i++)
            {
                for(j = 0; j<m; j++)
                {
                    scanf("%c",&map[i][j]);
                    if(map[i][j] == '@')
                    {
                        fi = i;
                        fj = j;
                    }
                }
                getchar();
            }
             cot= 0;
            dfs(fi,fj);
            printf("%d
    ",cot);
        }
    
        return 0;
    }

    版权声明:此代码归属博主, 请务侵权!
  • 相关阅读:
    CppUnit
    vconfig in linux
    POSIX semaphore: sem_open, sem_close, sem_post, sem_wait
    (Windows Command) diskpart
    亮块检测及取出亮块的中心坐标
    CacheMetaData Method of Activity
    (C#) Encoding.
    (C#) 线程操作 限制可同时访问某一资源或资源池的线程数。Semaphore 类。Mutex类
    (C# 基础) 跳转 (break, continue, goto, return, throw ).
    (C#基础) 字符串数据和操作
  • 原文地址:https://www.cnblogs.com/www-cnxcy-com/p/4678523.html
Copyright © 2020-2023  润新知