zoukankan      html  css  js  c++  java
  • POJ 1979 题解

    Red and Black
    Time Limit: 1000MS   Memory Limit: 30000K
    Total Submissions: 31722   Accepted: 17298

    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

     
     1 #include "cstdio"
     2 #include "cstring"
     3 #include "cmath"
     4 #include "iostream"
     5 #include "string"
     6 
     7 using namespace std ;
     8 const int maxN = 210 ;
     9 
    10 const int dx[ 10 ] = { 1 , 0 , 0 , -1 } ;
    11 const int dy[ 10 ] = { 0 , 1 , -1 , 0 } ;
    12 
    13 char mp[ maxN ][ maxN ] ;
    14 int N , M ;
    15 
    16 void DFS ( const int xi , const int yi ) {
    17         if ( !mp[ xi ][ yi ] )return ;
    18         mp[ xi ][ yi ] = '%' ;
    19         for ( int i=0 ; i<4 ; ++i ) {
    20                 int xx = xi + dx[ i ] ;
    21                 int yy = yi + dy[ i ] ;
    22                 if ( xx > 0 && xx <= M && yy > 0 && yy <= N && mp[ xx ][ yy ] == '.' )  
    23                         DFS( xx , yy ) ;
    24         }
    25 }
    26 
    27 int sumerize ( const int n , const int m ) {
    28         int ret ( 0 ) ; 
    29         for ( int i=1 ; i<=n ; ++i ) {
    30                 for ( int j=1 ; j<=m ; ++j ) {
    31                         if ( mp[ i ][ j ] == '%' ) ++ret ; 
    32                 }
    33         }
    34         return ret ;
    35 }
    36 
    37 int main ( ) {
    38         int start_x , start_y ; 
    39         while ( scanf ( "%d%d
    " , &N , &M ) == 2 && N && M ) {
    40                 for ( int i=1 ; i<=M ; ++i ) {
    41                         scanf ( "%s" , mp[ i ] + 1 ) ;
    42                 }
    43                 for ( int i=1 ; i<=M ; ++i ) {
    44                         for ( int j=1 ; j<=N+1 ; ++j ) {
    45                                 if ( mp[ i ][ j ] == '@' ) {
    46                                         mp[ i ][ j ] = '.' ; 
    47                                         start_x = i ; 
    48                                         start_y = j ;
    49                                         goto Loop ; 
    50                                 }
    51                         }
    52                 }
    53                 Loop :
    54                 DFS ( start_x , start_y ) ;
    55                 
    56                 printf ( "%d
    " , sumerize ( M , N ) ) ; 
    57                 memset ( mp , 0 , sizeof ( mp ) ) ;
    58         } 
    59         
    60         return 0 ; 
    61 } 
    View Code

    2016-10-21  16:28:48

  • 相关阅读:
    一个经典的多线程同步问题
    原子操作 Interlocked系列函数
    C中的volatile用法
    android值类型转换
    Button事件的三种实现方法
    【Android UI】顶部or底部菜单的循环滑动效果一
    【Android UI】侧滑栏的使用(HorizontalScrollView控件的使用)
    Android问题解决
    【Android UI】自定义带按钮的标题栏
    Android 设置 横屏 竖屏
  • 原文地址:https://www.cnblogs.com/shadowland/p/5985104.html
Copyright © 2011-2022 走看看