别墅房间 CodeVS原创

题目描述 Description

小浣熊松松到他的朋友家别墅去玩,发现他朋友的家非常大,而且布局很奇怪。具体来说,朋友家的别墅可以被看做一个N*M的矩形,有墙壁的地方被标记为’#’,其他地方被标记为’.’。两个格子(a,b)和(c,d)被当做在同一个房间内,当且仅当|a-c|+|b-d|=1。现在松松想知道,有多少个房间。

输入描述 Input Description

第一行包含两个整数,N和M。

接下来N行描述别墅的情况,只包含’*’和’.’。

输出描述 Output Description

输出仅一行,为房间数。

样例输入 Sample Input

3 3

.#.

#.#

.#.

样例输出 Sample Output

5

数据范围及提示 Data Size & Hint

对于90%的数据,1<=N,M<=1000;

对于100%的数据,1<=N,M<=2000。

代码实现:

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int n,m,ans;
 5 int bh[]={1,0,-1,0},bl[]={0,1,0,-1};
 6 char ch;
 7 bool map[2010][2010];
 8 void dfs(int h,int l){
 9     map[h][l]=1;
10     for(int i=0;i<4;i++){
11         int nh=h+bh[i],nl=l+bl[i];
12         if(!map[nh][nl]&&nh>0&&nh<=n&&nl>0&&nl<=m) dfs(nh,nl);
13     }
14 }
15 int main(){
16     scanf("%d%d",&n,&m);
17     for(int i=1;i<=n;i++)
18     for(int j=1;j<=m;j++){
19         cin>>ch;
20         if(ch=='#') map[i][j]=1;
21     }
22     for(int i=1;i<=n;i++)
23     for(int j=1;j<=m;j++)
24     if(!map[i][j]){ans++;dfs(i,j);}
25     printf("%d\n",ans);
26     return 0;
27 }

好消息,我还会打搜索。

题目来源:CODE[VS]

posted @ 2017-01-18 17:29  J_william  阅读(157)  评论(0编辑  收藏  举报