HDU-1312

#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遍历操作,算是一个板子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值