买房子

来源:互联网 发布:windows 自带工具 u盘 编辑:程序博客网 时间:2024/04/27 13:26

实验任务

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);      }     }
0 0
原创粉丝点击