• Day5 打卡acwing 1113.红与黑


    有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。

    你站在其中一块黑色的瓷砖上,只能向相邻(上下左右四个方向)的黑色瓷砖移动。

    请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

    输入格式

    输入包括多个数据集合。

    每个数据集合的第一行是两个整数 WW 和 HH,分别表示 xx 方向和 yy 方向瓷砖的数量。

    在接下来的 HH 行中,每行包括 WW 个字符。每个字符表示一块瓷砖的颜色,规则如下

    1)‘.’:黑色的瓷砖;
    2)‘#’:红色的瓷砖;
    3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。

    当在一行中读入的是两个零时,表示输入结束。

    输出格式

    对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

    数据范围

    1W,H201≤W,H≤20

    输入样例:

    6 9 
    ....#. 
    .....# 
    ...... 
    ...... 
    ...... 
    ...... 
    ...... 
    #@...# 
    .#..#. 
    0 0
    

    输出样例:

    45
    利用DFS方法如下:
    #include<iostream>
    using namespace std;
    
    int n, m;
    int dx[] = { 1,-1,0,0 }, dy[] = { 0,0,1,-1 };
    char map[21][21];
    
    int dfs(int x, int y)
    {
        int res = 1;
        map[x][y] = '#';
    
        for (int i = 0; i < 4; i++) {
            int a = x + dx[i], b = y + dy[i];
            if (a < n && a >= 0 && b < m && b >= 0 && map[a][b] == '.') {
                res += dfs(a, b);
            }
        }
    
        return res;
    }
    
    int  main() {
    
        
        while(cin >> m >> n, n || m){
            int x=0, y=0;
            for (int i = 0; i < n; i++)
                for (int j = 0; j < m; j++)
                { 
                    cin >> map[i][j];
                    if (map[i][j] == '@')
                    {
                        x = i;
                        y = j;
                    }
                }
        
            cout << dfs(x, y) <<endl;
        }
        return 0;
    }

     第二种方法,利用BFS:

    #include<iostream>
    #include<queue>
    #include<algorithm>
    using namespace std;
    
    #define  xx first
    #define  yy second
    
    int n, m;
    int dx[] = { 1,0,-1,0 }, dy[] = { 0,1,0,-1 };
    char map[21][21];
    typedef pair<int, int> PII;
    
    
    int bfs(int x, int y) 
    {
        queue<PII> que;
        que.push({ x,y });
        map[x][y] = '#';
        int res = 0;
    
        while (que.size()) 
        {
            auto t = que.front();
            que.pop();
            res++;
    
            for (int i = 0; i < 4; i++) {
                int a = t.xx + dx[i], b = t.yy + dy[i];
    
                if (a < 0 || a >= n || b < 0 || b >= m || map[a][b] != '.')
                    continue;
                map[a][b] = '#';
                que.push({ a,b });
            }
        }
    
        return res;
    }
    
    int main() {
    
        while (cin >> m >> n, m || n)
        {
            int sx = 0, sy = 0;
            for (int i = 0; i < n; i++)
                for (int j = 0; j < m; j++) 
                {
                    cin >> map[i][j];
                    if (map[i][j] == '@'){
                        sx = i;
                        sy = j;
                    }
                }
            cout << bfs(sx, sy) <<endl;
        }
    
        return 0;
    }
  • 相关阅读:
    vue-cli3安装使用
    document.readyState
    js的堆与栈
    常用方法
    js常见排序算法
    微信小程序swiper高度问题
    微信小程序滑动菜单
    数据筛选和排序------的解析
    使用Windows实现数据绑定----------的解析
    实现Windoes程序的数据更新------的详细解析
  • 原文地址:https://www.cnblogs.com/xiaowangdatie/p/14487235.html
Copyright © 2020-2023  润新知