买房子

实验任务

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);  
    }     
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值