题目描述
有一个长方形的房间,铺着方形瓷砖。每块瓷砖都涂上红色或黑色。一个男人站在黑色的瓷砖上。从瓦片,他可以移动到四个相邻的瓷砖之一。但他不能在红瓦上移动,他只能在黑瓦上移动。
编写一个程序,通过重复上述步骤来计算他可以达到的黑色瓷砖的数量。
编写一个程序,通过重复上述步骤来计算他可以达到的黑色瓷砖的数量。
输入
输入由多个数据集组成。数据集以包含两个正整数W和H的行开始; W和H分别是x方向和y方向上的瓦片数量。W和H不超过20.
数据集中有更多的行,每个行包含W个字符。每个字符表示一个瓦片的颜色如下。
'' - 黑色瓦片
'#' - 红色瓦片
'@' - 黑色瓦片上的男士(在数据集中恰好出现一次)
输入的末尾由包含两个零的行表示。
数据集中有更多的行,每个行包含W个字符。每个字符表示一个瓦片的颜色如下。
'' - 黑色瓦片
'#' - 红色瓦片
'@' - 黑色瓦片上的男士(在数据集中恰好出现一次)
输入的末尾由包含两个零的行表示。
输出
对于每个数据集,程序应该输出一行,其中包含他可以从初始图块(包括自身)到达的图块数量。
样例输入
6 9
....#。
.....#
......
......
......
......
......
#@#...
#..#。
11 9
#.........
。########。
###......。
######。
##.. @#,#。
。#######。
#.......#。
。#########。
...........
11 6
..#..#..#..
..#..#..#..
..#..#.. ###
..#..#..#@。
..#..#..#..
..#..#..#..
7 7
..##..
..##..
###。###
... @ ...
###。###
..##..
..##..
0 0
样例输出
45
59
6
13
算法实现:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m,vis[30][30],ans;
int fx[4]={0,0,1,-1},fy[4]={1,-1,0,0};//用来记录移动的xy方位
char tile[30][30];//记录迷宫
void dfs(int x,int y){
ans++;//计算步数
vis[x][y]=1; //将此位置记录 已走过
for(int i=0;i<4;i++){ //向四个方位分别搜索
int nx=x+fx[i];
int ny=y+fy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&!vis[nx][ny]&&tile[nx][ny]=='.')//判断是否越界是否走过是否可走
dfs(nx,ny);
}
}
int main(){
while(cin>>m>>n,m!=0,n!=0){
ans=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
cin>>tile[i];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(tile[i][j]=='@'&&!vis[i][j]){
dfs(i,j);
break;
}
}
}
cout<<ans<<endl;
}
return 0;
}