实验任务
Ytaaa最近刚买了一栋房子,欣喜之余,细心的 ytaaa 想要知道房子的占地面积。Ytaaa
的房子是一个位于矩形之内的不规则图形,现有一份 6X9 的地图:
@代表目前 ytaaa 的位置,.代表可以通过的地方,#代表围墙,ytaaa 可以走到的地方
均属于 ytaaa,现在请你帮忙统计,ytaaa 的房子到底有多大。
数据输入
输入第一行包括两个正整数 m(m<=20),n(n<=20),地图大小。接下来 N 行为 ytaaa 提供的地图。
数据输出
输出仅有一个数,ytaaa 的住宅面积。
输入示例
输出示例
45
解题思路
简单的DFS应用。
注意要把那些 虽然是“.”但是进不去的地方 也标记成“#”。
参考代码
#include <stdio.h>
#include <string.h>
const int maxn = 25;
char map[maxn][maxn]; //存储地图
bool pos[maxn][maxn]; //标记是否搜索过
int dir[9][2] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,0},{0,1},{1,-1},{1,0},{1,1}}; //搜索的9个方向 (其中{0,0}可有可无)
int p_x = 0,p_y = 0; //记录起始位置
int ans,m,n;
void InputMap();
void Check();
void DFS(int x,int y);
int main()
{
int i,j;
while (~scanf("%d%d",&m,&n)){
getchar();
memset(pos,true,sizeof(pos));
memset(map,'#',sizeof(map)); //初始化
InputMap(); //读入地图
Check(); //检查哪些是不能进入的“.”
ans = 0;
DFS(p_x,p_y);//从起始位置开始DFS
printf("%d\n",ans);
}
return 0;
}
void InputMap()
{
int i,j;
for (i = 1;i <= n;i++){
for (j = 1;j <= m;j++){
scanf("%c",&map[i][j]);
if (map[i][j] == '@')
p_x = i,p_y = j;
}
getchar();
}
}
void Check()
{
int i,j;
for (i = 1;i <= n;i++)
for (j = 1;j <= m;j++)
if (map[i-1][j] == '#' && map[i+1][j] == '#' &&map[i][j-1] == '#' &&map[i][j+1] == '#') //如果上、下、左、右都是'#'的话,中间这个肯定是不能进入的,同样标记成'#'
map[i][j] = '#';
}
void DFS(int x,int y)
{
pos[x][y] = false; //搜索过的做好标记
ans ++;
int i;
for (i = 0;i < 9;i++){
int dx = x+dir[i][0],dy = y+dir[i][1];
if (map[dx][dy] == '.' && pos[dx][dy])
DFS(dx,dy);
}
}