题目描述
有一个长方形的房间,覆盖了正方形的磁砖。每块磁砖的颜色,要么是红色,要么是黑色。一名男子站在一块黑色的磁砖上。他可以从一块磁砖移至相邻四块磁砖中的某一块。但是,他不允许在红色磁砖上移动,他只允许在黑色磁砖上移动。
编写一个程序,使得他允许重复上述的移动,判断他所能到达的黑色磁砖的数量。
输入
输入由多个数据集组成。数据集的起始行包含了两个正整数 W 和 H;W 和 H 分别是 x- 和 y- 方向的磁砖数量。W 和 H 不超过 20 。
在数据集中,还有 H 行,每行包含了 W 个字符。每个字符按如下方式表示一块磁砖的颜色。
‘.’ - 一块黑色的磁砖
‘#’ - 一块红色的磁砖
‘@’ - 一名男子,站在一块黑色磁砖上 (在一个数据集中,恰好出现一次)
以包含两个 0 的一行,表示输入结束。
输出
对于每个数据集,程序应当输出一行,包含他从初始磁砖所能抵达的磁砖数量 (包括初始磁砖自身)。
示例输入
6 9
…#.
…#
…
…
…
…
…
#@…#
.#…#.
11 9
.#…
.#.#######.
.#.#…#.
.#.#.###.#.
.#.#…@#.#.
.#.#####.#.
.#…#.
.#########.
…
11 6
…#…#…#…
…#…#…#…
…#…#…###
…#…#…#@.
…#…#…#…
…#…#…#…
7 7
…#.#…
…#.#…
###.###
…@…
###.###
…#.#…
…#.#…
0 0
示例输出
45
59
6
13
Code
/*
* @Description: Red and Black
* @version:
* @Author:
* @Date: 2021-04-14 12:59:46
* @LastEditors: Please set LastEditors
* @LastEditTime: 2021-04-14 16:52:51
*/
// self
#include <iostream>
#include <queue>
using namespace std;
char room[20][20];
bool flag[20][20];
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int count = 0;
struct point
{
int x;
int y;
};
void BFS(int w, int h, int indexX, int indexY)
{
::count = 0;
queue<struct point> q;
struct point temp;
temp.x = indexX;
temp.y = indexY;
q.push(temp);
flag[indexX][indexY] = true;
while (!q.empty())
{
int x = q.front().x, y = q.front().y;
for (int i = 0; i < 4; i++)
{
int nextX = x + dir[i][0], nextY = y + dir[i][1];
if (nextX < 0 || nextX >= h || nextY < 0 || nextY >= w)
continue;
if (flag[nextX][nextY])
continue;
if (room[nextX][nextY] == '#')
continue;
temp.x = nextX;
temp.y = nextY;
flag[nextX][nextY] = true;
q.push(temp);
}
::count++;
q.pop();
}
}
int main()
{
int width, height;
while (cin >> width >> height && (width != 0 || height != 0))
{
// 输入数据及初始化标志数组
int indexX, indexY;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
cin >> room[i][j];
if (room[i][j] == '@')
{
indexX = i;
indexY = j;
}
flag[i][j] = false;
}
}
BFS(width, height, indexX, indexY);
cout << ::count << endl;
}
system("pause");
return 0;
}
// 提交一次
// 调试中遇到的问题
// 忘记出队列
// 忘记判断坐标是否超出范围
// 忘记置标志数组为true
// 在循环外将count+1,导致count多1