• Red and Black


    Red and Black

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


    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
     
    思路:确实是简单dfs,初学者一定要多想
     
    #include<stdio.h>
    #include<string.h>
    char str[22][22];
    int temp[22][22];
    int cnt,h,w;
    void dfs(int x,int y)
    {
        cnt ++;
        temp[x][y] = 1;
        if(!temp[x+1][y]&& x+1 < w)
            dfs(x+1,y);
        if(!temp[x-1][y] && x-1 > -1)
            dfs(x-1,y);
        if(!temp[x][y+1] && y+1 < h)
            dfs(x,y+1);
        if(!temp[x][y-1] && y-1 > -1)
            dfs(x,y-1);
    }
    
    int main()
    {
        int i,j,a,b;
        while(~scanf("%d%d",&h,&w)&&h+w)
        {
            cnt = 0;
            for(i = 0;i < w;i ++)
            {
                scanf("%s",str[i]);
                for(j = 0;j < h;j ++)
                {
                    if(str[i][j] == '#')
                        temp[i][j] = 1;
                    if(str[i][j] == '.')
                        temp[i][j] = 0;
                    if(str[i][j] == '@')
                    {
                        a = i;
                        b = j;
                    }
                }
            }
            dfs(a,b);
            printf("%d
    ",cnt);
        }
        return 0;
    }
  • 相关阅读:
    [LeetCode] Min Stack
    [LeetCode] Find Minimum in Rotated Sorted Array
    [LeetCode] Maximum Product Subarray
    [Jobdu] 题目1504:把数组排成最小的数
    [Jobdu] 题目1544:数字序列区间最小值
    Python2.3-原理之语句和语法
    Python2.5-原理之模块
    Vim2.1-Vim简明教程【CoolShell】【非原创】
    Python2.6-原理之类和oop(下)
    QT1.1-与Opencv的hello world
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3337460.html
Copyright © 2020-2023  润新知