zoukankan      html  css  js  c++  java
  • codevs 2806 红与黑

    题目描述 Description

    有一个矩形房间,覆盖正方形瓷砖。每块瓷砖涂成了红色或黑色。一名男子站在黑色的瓷砖上,由此出发,可以移到四个相邻瓷砖之一,但他不能移动到红砖上,只能移动到黑砖上。编写一个程序,计算他通过重复上述移动所能经过的黑砖数。

    输入描述 Input Description

    输入包含多个数据集。一个数据集开头行包含两个正整数W和H,W和H分别表示矩形房间的列数和行数,且都不超过20.
    每个数据集有H行,其中每行包含W个字符。每个字符的含义如下所示:
    '.'——黑砖
    '#'——红砖
    '@'——男子(每个数据集仅出现一次)
    两个0表示输入结束。

    输出描述 Output Description

    对每个数据集,程序应该输出一行,包含男子从初始瓷砖出发可到达的瓷砖数。

    样例输入 Sample Input

    6 9
    ....#.
    .....#
    ......
    ......
    ......
    ......
    ......
    #@...#
    .#..#.
    11 9
    .#.........
    .#.#######.
    .#.#.....#.
    .#.#.###.#.
    .#.#..@#.#.
    .#.#####.#.
    .#.......#.
    .#########.
    ...........
    11 6
    ..#..#..#..
    ..#..#..#..
    ..#..#..###
    ..#..#..#@.
    ..#..#..#..
    ..#..#..#..
    7 7
    ..#.#..
    ..#.#..
    ###.###
    ...@...
    ###.###
    ..#.#..
    ..#.#..
    0 0

    样例输出 Sample Output

    45
    59
    6
    13

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    
    using namespace std;
    const int N=21;
    const int xd[4]={0,0,1,-1};
    const int yd[4]={-1,1,0,0};
    
    int a[N][N];
    bool vis[N][N];
    int n,m;
    
    inline int read()
    {
        int x=0;
        char c=getchar();
        while(c<'0'||c>'9')c=getchar();
        while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
        return x;
    }
    
    inline void dfs(int x,int y)
    {
        vis[x][y]=1;
        for(int i=0;i<=3;i++)
        {
            int xx=x+xd[i];
            int yy=y+yd[i];
            if(a[xx][yy]==1&&xx>0&&xx<=m&&yy>0&&yy<=n&&!vis[xx][yy])
                dfs(xx,yy);
        }
    }
    
    int main()
    {
        while(1)
        {
            int start,endd;
            n=read();
            m=read();
            if(!n)return 0;
            memset(a,0,sizeof(a));
            memset(vis,0,sizeof(vis));
            for(int i=1;i<=m;i++)
            {
                char c;
                for(int j=1;j<=n;j++)
                {
                    scanf("%c",&c);
                    if(c=='.')a[i][j]=1;
                    if(c=='#')a[i][j]=0;
                    if(c=='@')start=i,endd=j;
                }
                scanf("%c",&c);
            }
            dfs(start,endd);
            
            int answer=0;
            
            for(int i=1;i<=m;i++)
                for(int j=1;j<=n;j++)
                    if(vis[i][j])
                        answer++;
                        
            printf("%d
    ",answer);
        }
    
        return 0;
    }
  • 相关阅读:
    v-chart使用的相关实例
    v-chart从后台获取数据
    算法题-单词搜索
    关于前端开发的一些小经验总结
    element的input中加入可点击的按钮
    vue.js的入门
    链表问题(算法题)
    同构词分类
    最长不降序子列的改编(dp数组的使用)
    Ubuntu安装Git
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/7059797.html
Copyright © 2011-2022 走看看