Description - 题目描述
有个铺满方形瓷砖的矩形房间,每块瓷砖的颜色非红即黑。某人在一块砖上,他可以移动到相邻的四块砖上。但他只能走黑砖,不能走红砖。
敲个程序统计一下这样可以走到几块红砖上。
Input - 输入
多组测试用例。每组数组开头有两个正整数W和H;W与H分别表示 x- 与 y- 方向上瓷砖的数量。W和W均不超过20。
还有H行数据,每行包含W个字符。每个字符表示各色瓷砖如下。
'.' - 一块黑砖
'#' - 一块红砖
'@' - 一个黑砖上的人(一组数据一个人)
输入以一行两个零为结束。
Output - 输出
对于每组测试用例,输出他从起始砖出发所能抵达的瓷砖数量(包括起始砖)。
Sample Input - 输入样例
6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0
Sample Output - 输出样例
45
59
6
13
简单的一道dfs题(至少某本书是把它放到了dfs。但我觉得bfs应该也行吧
但是要注意有多组数据。
直接给代码。(不排除代码丑到爆的可能
#include<cstdio>
int w,h,ans,dr[5]={0,1,0,-1,0};
char a[25][25];
void dfs(int x,int y)
{
if(x>h||y>w||x<=0||y<=0||a[x][y]=='#') return;
ans++;a[x][y]='#';
for(int i=1;i<=4;i++) dfs(x+dr[i-1],y+dr[i]);
}
int main()
{
int i,j,s,e;
while(1)
{
ans=s=e=0;
scanf("%d%d",&w,&h);
if(!w) break;
for(i=1;i<=h;i++)
scanf("%s",a[i]+1);
for(i=1;i<=h;i++)
{
for(j=1;j<=w;j++)
if(a[i][j]=='@')
{
s=i;e=j;break;
}
if(s) break;
}
dfs(s,e);
printf("%d\n",ans);
}
}