• hud 1312


    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. 

    InputThe 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) 
    OutputFor 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>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <bitset>
    using namespace std;
    
    #define rep(i,a,b) for (int i=(a),_ed=(b);i<=_ed;i++)
    #define per(i,a,b) for (int i=(b),_ed=(a);i>=_ed;i--)
    #define pb push_back
    
    const int inf_int = 2e9;
    const long long inf_ll = 2e18;
    #define inf_add 0x3f3f3f3f
    #define mod 1000000007
    #define LL long long
    #define ULL unsigned long long
    #define MS0(X) memset((X), 0, sizeof((X)))
    #define SelfType int
    SelfType Gcd(SelfType p,SelfType q){return q==0?p:Gcd(q,p%q);}
    SelfType Pow(SelfType p,SelfType q){SelfType ans=1;while(q){if(q&1)ans=ans*p;p=p*p;q>>=1;}return ans;}
    #define Sd(X) int (X); scanf("%d", &X)
    #define Sdd(X, Y) int X, Y; scanf("%d%d", &X, &Y)
    #define Sddd(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)
    #define reunique(v) v.resize(std::unique(v.begin(), v.end()) - v.begin())
    #define all(a) a.begin(), a.end()
    #define   mem(x,v)      memset(x,v,sizeof(x))
    typedef pair<int, int> pii;
    typedef pair<long long, long long> pll;
    typedef vector<int> vi;
    typedef vector<long long> vll;
    #define PI acos(-1.0)
    #define exp 1e-9
    char mp[25][25];
    int vis[25][25];
    int ans;
    void dfs(int x,int y)
    {
        if(mp[x-1][y]=='.'&&vis[x-1][y]==0){
            ans++;
            vis[x-1][y] = 1;
            dfs(x-1,y);
        }
        if(mp[x][y-1]=='.'&&vis[x][y-1]==0){
            ans++;
            vis[x][y-1] = 1;
            dfs(x,y-1);
        }
        if(mp[x][y+1]=='.'&&vis[x][y+1]==0){
            ans++;
            vis[x][y+1]= 1;
            dfs(x,y+1);
        }
        if(mp[x+1][y]=='.'&&vis[x+1][y]==0){
            ans++;
            vis[x+1][y] = 1;
            dfs(x+1,y);
        }
    }
    int main()
    {
        int n,m,i,j;
        while(scanf("%d%d",&m,&n),m+n)
        {
            getchar();
            ans=0;
            memset(vis,0,sizeof(vis));
            memset(mp,'#',sizeof(mp));
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=m;j++)
                {
                    scanf("%c",&mp[i][j]);
                }
                getchar();
            }
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=m;j++)
                {
                    if(mp[i][j]=='@')
                    {
                        ans++;
                        vis[i][j]=1;
                        dfs(i,j);
                        i=n;
                        j=m;
                    }
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    终于明白迅雷使用积分制的真正作用和目的了(教大家改迅雷)
    免费搞QQ空间
    终于明白迅雷使用积分制的真正作用和目的了(教大家改迅雷)
    终于明白迅雷使用积分制的真正作用和目的了(教大家改迅雷)
    免费搞QQ空间
    免费搞QQ空间
    如何配置Windows Live Writer
    求PI的近似值,用公式PI/4=11/3+1/51/7+...
    求31000之间的素数
    通过Office 2007发布Blog
  • 原文地址:https://www.cnblogs.com/kls123/p/7132423.html
Copyright © 2020-2023  润新知