原题地址:点击传送
问题描述:
有一个长方形的房间里,是用方瓦覆盖的。每个方瓦的颜色是红色或黑色。一名男子正站在一个黑色瓷砖。他从他所站的方瓦上,可以转移到相邻的四个砖之一。但他无法进入红瓦,他只可以进入黑瓦。编写一个程序来计算黑瓦数量,也就是他可以达到的方瓦数(重复上述动作)。输入:
输入包含多个数据集。一个数据集的包含有在开始的第一行的两个正整数W和H,W和H表示x和y方向上的方瓦数。 W和H的不超过20。之后有H行的数据集,其中每行包括W列字符。每个字符代表着瓷砖的颜色如下:
’.’ -黑色瓦片
‘#’-一个红色的瓷砖
‘@’-一黑砖上的人
该程序可以循环输入,当输入的W和H都为0时,程序终止。
输出:
有多少块黑瓦
Sample Input
6 9....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0
Sample Output
45
59
6
13
思路:
直接以人的初始位置开始dfs搜索附近的可以达到的位置并标记已经达到的位置
代码:
#include <iostream>
#define MAX_W 100
#define MAX_H 100
using namespace std;
int w, h, ans;
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};
char m[MAX_H][MAX_W + 1];
void dfs(int x, int y)
{
ans ++;
m[x][y] = '@';
for(int i = 0; i < 4; i ++){
int nx = x + dx[i], ny = y + dy[i];
if(nx >= 0 && nx < h && ny >= 0 && ny < w && '.' == m[nx][ny])
dfs(nx, ny);
}
}
void solve()
{
int flag = 0;
ans = 0;
for(int i = 0; i < h; i ++){
for(int j = 0; j < w; j ++)
if('@' == m[i][j]){
dfs(i, j);
flag = 1;
break;
}
if(flag)
break;
}
cout << ans << endl;
}
int main()
{
while(cin >> w >> h){
for(int i = 0; i < h; i ++)
cin >> m[i];
if(w || h)
solve();
else
break;
}
return 0;
}