#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/*
有一个长方形的房间,上面铺着正方形的瓷砖。每个瓷砖都是红色或黑色的。一个男人站在一块黑色的瓷砖上。从一个贴图,他可以移动到四个相邻的贴图中的一个。但是他不能在红色方块上移动,他只能在黑色方块上移动。
编写一个程序,通过重复上述操作来计算他可以得到的黑色方块的数量。
输入
输入由多个数据集组成。一个数据集以一行包含两个正整数W和H开始;W和H分别是x和y方向上的方块数量。W和H不超过20。
数据集中还有H行,每一行包含W个字符。每个字符表示瓷砖的颜色,如下所示。
”。——一块黑色的瓷砖
` # `——红色瓷砖
'@'——黑色格子上的一个人(在数据集中只出现一次)
输出
对于每个数据集,你的程序应该输出一行,其中包含从初始块(包括它自己)开始他可以到达的瓦片数量。
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0
*/
char room[22][22];//静态数组空间换时间
int x, y;//room大小
struct node { int x; int y; };
bool check(node n, int x, int y) { if (n.x >= 0 && n.x < x && n.y >= 0 && n.y < y) return true; return false; }
/*
大致思路为传入起点 遍历周围元素 同时判断是否越界 设置坐标node结构体 对应坐标 搜过就标记为true 直到empty 计算num
*/
int dir[4][2] =
{
{-1,0},//向左
{0,-1},//向上
{1,0},//向右
{0,1}//向下
};
void bfs(int dx, int dy)
{
queue<node> q;
int count = 1;//计数
q.push({ dx,dy });
while (!q.empty())
{
node now = q.front();
//遍历
for (int i = 0; i < 4; i++)
{
node n = { now.x,now.y };
n.x = n.x + dir[i][0];
n.y = n.y + dir[i][1];
if (check(n, x, y) && room[n.x][n.y] == '.')//注意这里不能写成!='#'否则起点会多记录一次
{
room[n.x][n.y] = '#';
q.push(n);
count++;
}
}
q.pop();
}
cout << count << endl;
}
int main() {
int dx, dy;//代表起点坐标
while (cin >> y >> x) {
//x行 y列
if (x == 0 && y == 0) break;
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
cin >> room[i][j];
if (room[i][j] == '@')
{
dx = i;
dy = j;
}
}
}
//cout << dx << dy; 测试
bfs(dx, dy);
}
}
一个很基础的bfs遍历操作,算是一个板子