1405: Red and Black
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 287 Solved: 196
Submit Status Web Board
Description
有一个矩形房间,覆盖着正方形瓷砖。每块瓷砖涂成了红色或黑色。一名男子站在黑色的瓷砖上,由此出发,可以移到四个相邻瓷砖之一,但他不能移动到红砖上,只能移动到黑砖上。编写一个程序,计算他通过重复上述移动所能经过的黑砖数。
Input
输入包含多个数据集。一个数据集开头行包含两个整数
W
和
H
,
W
和
H
分别表示矩形房间的列数和行数,且都不超过
20
。
每个数据集有
H
行,其中每行包含
W
个字符。每个字符的含义如下所示:
'.' –
黑砖;
'#' –
红砖
'@' –
男子(每个数据集仅出现一次)
两个0表示输入结束。
Output
对于每个数据集,程序应该输出一行,包含男子从初始瓷砖出发可到达的瓷砖数(包括他自己所站的那一块瓷砖)。
Sample Input
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
Sample Output
45 59 6 13
<span style="font-size:18px;">/* 好长时间没有做,都快不会了,简单的dfs
*/
#include<cstdio>
#include<cstring>
char map[30][30];
int x,y,ans;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int n,m;
void dfs(int sx,int sy)
{
int i;
for(i=0;i<4;++i)
{
int ex=sx+dx[i];
int ey=sy+dy[i];
if(ex<1||ex>m||ey<1||ey>n)
continue;
if(map[ex][ey]=='.')
{
++ans;
map[ex][ey]='#';
dfs(ex,ey);
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF&&n!=0||m!=0)
{
int i,j;
for(i=1;i<=m;++i)
{
scanf("%s",map[i]+1);
for(j=1;j<=n;++j)
{
if(map[i][j]=='@')
{
x=i;y=j;
}
}
}
ans=1;
dfs(x,y);
printf("%d\n",ans);
}
return 0;
} </span>