zoukankan      html  css  js  c++  java
  • POJ1979 Red and Black

    速刷一道DFS

    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) 
    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
    

    Source

    刷道普通的DFS,复习模板

     1 /*by SilverN*/
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 using namespace std;
     8 const int mxn=50;
     9 char mp[mxn][mxn];
    10 int ans;
    11 int W,H;
    12 void dfs(int x,int y){
    13     if(x<1 || x>H || y<1 || y>W)return;
    14     if(mp[x][y]=='#')return;
    15     ans++;
    16     mp[x][y]='#';
    17     dfs(x+1,y);
    18     dfs(x,y+1);
    19     dfs(x-1,y);
    20     dfs(x,y-1);
    21     return;
    22 }
    23 int main(){
    24     while(scanf("%d%d",&W,&H) && W && H){
    25         memset(mp,' ',sizeof(mp));
    26         ans=0;
    27         int i,j;
    28         for(i=1;i<=H;i++){
    29             scanf("%s",mp[i]+1);
    30         }
    31         int sx,sy;
    32         bool flag=0;
    33         for(i=1;i<=H;i++){
    34               for(j=1;j<=W;j++)
    35                   if(mp[i][j]=='@'){
    36                       sx=i;sy=j;
    37                       flag=1;
    38                       break;
    39                   }
    40             if(flag)break;
    41         }
    42         dfs(sx,sy);
    43         printf("%d
    ",ans);
    44     }
    45     return 0;
    46 }
  • 相关阅读:
    【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入
    【2018.04.27 C与C++基础】关于switch-case及if-else的效率问题
    【2018.04.19 ROS机器人操作系统】机器人控制:运动规划、路径规划及轨迹规划简介之一
    March 11th, 2018 Week 11th Sunday
    March 10th, 2018 Week 10th Saturday
    March 09th, 2018 Week 10th Friday
    March 08th, 2018 Week 10th Thursday
    March 07th, 2018 Week 10th Wednesday
    ubantu之Git使用
    AMS分析 -- 启动过程
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5585837.html
Copyright © 2011-2022 走看看