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;
}
原文地址:https://www.cnblogs.com/xiaowangdatie/p/14487235.html