搜索,问题 N: 红与黑☆☆

题目描述

小明站在一个矩形房间里,这个房间的地面铺满了地砖,每块地砖的颜色或是红色或是黑色。小明一开始站在一块黑色地砖上,并且小明从一块地砖可以向上下左右四个方向移动到其他的地砖上,但是他不能移动到红色地砖上,只能移动到黑色地砖上。
请你编程计算小明可以走到的黑色地砖最多有多少块。

输入

输入包含多组测试数据。
每组输入首先是两个正整数W和H,分别表示地砖的列行数。(1<=W,H<=20)
接下来H行,每行包含W个字符,字符含义如下:
‘.’表示黑地砖;
‘#’表示红地砖;
‘@’表示小明一开始站的位置,此位置是一块黑地砖,并且这个字符在每组输入中仅会出现一个。
当W=0,H=0时,输入结束。

输出

对于每组输入,输出小明可以走到的黑色地砖最多有多少块,包括小明最开始站的那块黑色地砖。

样例输入 复制
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0
样例输出 复制
45
59
6
13

题解 

和前面数房间问题到差不差,意思是说给出起点,求能够走的 '.' 的数量。

#include<bits/stdc++.h>
using namespace std;

int w,h,p,q,ans, dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};

char mp[25][25];
bool vis[25][25];

void dfs(int x, int y){
	ans ++;
	vis[x][y] = 1;
	for(int k = 0;k < 4;k ++){
		int nx = x + dx[k], ny = y + dy[k];
		if(nx < 1 || ny < 1 || nx > w || ny > h)continue;
		if(!vis[nx][ny] && mp[nx][ny] == '.')dfs(nx, ny);
	}
}

int main(){
	while(1){
		memset(vis, 0, sizeof vis);
		cin >> h >> w;
		ans = 0;
		if(w == 0 && h == 0)break;
		for(int i = 1;i <= w;i ++)
			for(int j = 1;j <= h;j ++){
				cin >> mp[i][j];
				if(mp[i][j] == '@')p = i, q = j, mp[i][j] = '.';
			}
		dfs(p, q);
		cout << ans << '\n';
	}
	return 0;
}

总结 

给出区域求面积题目,两种思路:从外到内淹没,从内到外上色。一定不能忘记vis数组。

求某种区域个数,将整块区域逐一dfs加以vis限制即可,可将不同区域涂上为不同颜色。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值