zoukankan      html  css  js  c++  java
  • HDU 1312 Red and Black(DFS,板子题,详解,零基础教你代码实现DFS)

    Red and Black

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 19731    Accepted Submission(s): 11991

    Problem Description
    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.
     
    Input
    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)
     
    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
     
    Source
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312
    分析:看到ZERO已经写了DFS,弱鸡也得补上此题,来一发!感谢梅大大的支持,代码的模版来自梅大大,我只是对主要步骤做了注释而已!
    下面给出AC代码:
     
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int _x[4]={1,0,-1,0};
     4 int _y[4]={0,-1,0,1};//相当于从第一象限开始顺时针转一周,对应的坐标轴上的点分别为(1,0),(0,-1),(-1,0),(0,1),就是数学意义上的方向向量
     5 char str[30][30];
     6 bool flag[30][30];//去判断点是否被标记过,DFS搜索一遍,被标记过记改点为1!
     7 int n,m,ans;
     8 void DFS(int x,int y)
     9 {
    10     for(int ii=0;ii<4;ii++)
    11     {
    12         int i=x+_x[ii];
    13         int j=y+_y[ii];
    14         if(i<n&&j<m&&i>=0&&j>=0&&flag[i][j]==0&&str[i][j]=='.')//边界条件
    15         {
    16             ans++;
    17             flag[i][j]=1;
    18             DFS(i,j);
    19         }
    20     }
    21 }
    22 int main()
    23 {
    24    while(scanf("%d%d",&m,&n)!=EOF)
    25    {
    26        if(m==0&&n==0)
    27         break;
    28        int x,y;
    29        memset(flag,0,sizeof(flag));
    30        for(int i=0;i<n;i++)
    31         scanf("%s",str[i]);
    32        for(int i=0;i<n;i++)
    33        {
    34            for(int j=0;j<m;j++)
    35            {
    36                if(str[i][j]=='@')//找到起始点
    37                {
    38                    x=i;
    39                    y=j;
    40                }
    41            }
    42        }
    43        ans=0;
    44        flag[x][y]=1;
    45        DFS(x,y);
    46        printf("%d
    ",ans+1);//第一个位置也算一个,所以+1
    47    }
    48    return 0;
    49 }
  • 相关阅读:
    学习C++的第一天
    2016.12.28
    无主之地
    一种排序
    街区最短问题
    配对类问题
    蛇形填数
    c#unity
    贪心
    台阶
  • 原文地址:https://www.cnblogs.com/ECJTUACM-873284962/p/6680198.html
Copyright © 2011-2022 走看看