• Red and Black



    Red and Black

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
    Total Submission(s) : 22   Accepted Submission(s) : 13

    Font: Times New Roman | Verdana | Georgia

    Font Size:  

    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

    Asia 2004, Ehime (Japan), Japan Domestic
    原本代码:2014.5.24
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 int D,SIGN,Len_X,Len_Y;
     5 char Map[100][100];
     6 int Sign[100][100];
     7 
     8 int Sign_Part(int x,int y)
     9 {
    10 
    11     int ii,jj;
    12     if(x>=Len_X||x<0||y>=Len_Y||y<0)return 0;
    13     if(Map[x][y]=='#')return 0;
    14     else Map[x][y]='#';
    15     /*putchar('
    ');
    16        for(ii=0;ii<Len_X;ii++)
    17         {
    18             for(jj=0;jj<Len_Y;jj++)
    19                 printf("%c",Map[ii][jj]);
    20             putchar('
    ');
    21         }*/
    22     Sign[x][y]=1;
    23     SIGN++;
    24     if(Map[x+1][y]!='#'&&x+1<Len_X&&Sign[x+1][y]!=1)
    25     {
    26         Sign_Part(x+1,y);
    27         Map[x+1][y]='.';
    28     }
    29     if(Map[x-1][y]!='#'&&x-1>=0&&Sign[x-1][y]!=1)
    30     {
    31         Sign_Part(x-1,y);
    32         Map[x-1][y]='.';
    33     }
    34     if(Map[x][y+1]!='#'&&y+1<Len_Y&&Sign[x][y+1]!=1)
    35     {
    36         Sign_Part(x,y+1);
    37         Map[x][y+1]='.';
    38     }
    39     if(Map[x][y-1]!='#'&&y-1>=0&&Sign[x][y-1]!=1)
    40     {
    41         Sign_Part(x,y-1);
    42         Map[x][y-1]='.';
    43     }
    44     return 0;
    45 
    46 }
    47 
    48 int main()
    49 {
    50     int i,j,Begin_x,Begin_y;
    51     while(scanf("%d%d",&Len_Y,&Len_X)!=EOF)
    52     {
    53         if(Len_X==0&&Len_Y==0)break;
    54         for(i=0;i<Len_X;i++)
    55         {
    56             getchar();
    57             for(j=0;j<Len_Y;j++)
    58             {
    59                 scanf("%c",&Map[i][j]);
    60                 if(Map[i][j]=='@')
    61                 {Begin_x=i;Begin_y=j;}
    62             }
    63         }
    64         SIGN=0;
    65         memset(Sign,0,sizeof(Sign));
    66         Sign_Part(Begin_x,Begin_y);
    67         printf("%d
    ",SIGN);
    68 
    69     }
    70 
    71     return 0;
    72 }
    View Code
    修改:2015.5.8
     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 using namespace std;
     5 int D,SIGN,Len_X,Len_Y;
     6 char Map[100][100];
     7 void BFS(int x,int y)
     8 {
     9     if(Map[x][y]=='#')return ;
    10     else
    11     {
    12         SIGN++;
    13         Map[x][y]='#';
    14         BFS(x-1,y);
    15         BFS(x+1,y);
    16         BFS(x,y-1);
    17         BFS(x,y+1);
    18     }
    19 }
    20 
    21 int main()
    22 {
    23     int i,j,Begin_x,Begin_y;
    24     while(scanf("%d%d",&Len_Y,&Len_X)!=EOF)
    25     {
    26         if(Len_X==0&&Len_Y==0)break;
    27         for(i=0;i<=Len_X+1;i++)
    28         {
    29             for(j=0;j<=Len_Y+1;j++)
    30             {
    31                 if(i==0||j==0||i==Len_X+1||j==Len_Y+1)Map[i][j]='#';
    32                 else
    33                 {
    34                     scanf(" %c",&Map[i][j]);
    35                     if(Map[i][j]=='@')
    36                     {Begin_x=i;Begin_y=j;}
    37                 }
    38 
    39             }
    40         }
    41         SIGN=0;
    42         BFS(Begin_x,Begin_y);
    43         printf("%d
    ",SIGN);
    44 
    45     }
    46     return 0;
    47 }
    View Code
    转载请备注:
    **************************************
    * 作者: Wurq
    * 博客: https://www.cnblogs.com/Wurq/
    * Gitee: https://gitee.com/wurq
    **************************************
  • 相关阅读:
    vue.js环境配置步骤及npm run dev报错解决方案
    消息处理之performSelector
    iOS开发网络篇—发送GET和POST请求(使用NSURLSession)
    iOS手机号正则表达式并实现344格式 (正则的另一种实现方式)
    IOS开发——正则表达式验证手机号、密码
    iOS网络请求之---GET和POST
    CLLocation
    ios本地文件内容读取,.json .plist 文件读写
    UITableViewCell的4种样式
    iOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry)
  • 原文地址:https://www.cnblogs.com/Wurq/p/3750333.html
Copyright © 2020-2023  润新知