以下摘要由GPT-4o生成:
该问题要求编写程序计算你从指定的黑色瓷砖出发能够到达的所有黑色瓷砖数量。输入数据包括多个数据集合,每个集合包含瓷砖的宽度和高度,以及瓷砖的颜色信息。黑色瓷砖用‘.’表示,红色瓷砖用‘#’表示,而起始位置用‘@’表示。程序需要遍历相邻的黑色瓷砖,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)算法来实现。输出每个数据集合中可到达的黑色瓷砖数,包括起始位置。结束输入时,当读取到“0 0”时停止处理。数据范围为1≤W,H≤20。

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

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

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

输入格式

输入包括多个数据集合。

每个数据集合的第一行是两个整数 W 和 H,分别表示 x 方向和 y 方向瓷砖的数量。

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

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

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

输出格式

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

数据范围

1≤W,H≤20

输入样例:

1
2
3
4
5
6
7
8
9
10
11
6 9 
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
0 0

输出样例:

1
45

解法一bfs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#define x first
#define y second
using namespace std;
const int N = 25;
char g[N][N];
int n, m;
typedef pair<int, int> PII;
int dx[] {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};

int bfs(int sx, int sy){
int res = 0;
queue<PII> q;
q.push({sx, sy});//压入第一个元素;
g[sx][sy] = '#';
while (! q.empty()) {
PII t = q.front();//取队列元素
res++;
q.pop();
for (int i = 0; i < 4; i++) {
int x = dx[i] + t.x;
int y = dy[i] + t.y;
if (x < 0 || x >= n || y < 0 || y >= m || g[x][y] != '.') continue;
g[x][y] = '#';
q.push({x, y});
}
}
return res;
}

int main(){


while (cin >> m >> n, m || n) {//注意先输入行数;
for (int i = 0; i < n; i++) cin >> g[i];
int x, y;

for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (g[i][j] == '@') {
x = i;
y = j;
}
}
}
cout << bfs(x, y) << endl;
}

return 0;
}

解法二dfs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 25;
char g[N][N];
int n, m;
int dx[] {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};

int dfs(int sx, int sy){
int res = 1;//表示当前格子可以搜索;
g[sx][sy] = '#';
for (int i = 0; i < 4; i++) {
int x = sx + dx[i];
int y = sy + dy[i];
if (x < n && x >= 0 && y <m && y >= 0 && g[x][y] == '.') {
res += dfs(x, y);//加可以搜索的格子数;
}
}
return res;
}

int main(){


while (cin >> m >> n, m || n) {//注意先输入行数;
for (int i = 0; i < n; i++) cin >> g[i];
int x, y;

for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (g[i][j] == '@') {
x = i;
y = j;
}
}
}
cout << dfs(x, y) << endl;
}

return 0;
}