codevs——3410 别墅房间
题目描述
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。
思路:大水题一道,随便一个搜索就可以。
这里我用的深搜
代码:
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define N 2001 using namespace std; char q; int n,m,ans; bool a[N][N]; int x[5]={0,1,-1,0,0},y[5]={0,0,0,1,-1}; void dfs(int xx,int yy) { for(int i=1;i<=4;i++) { if(a[xx+x[i]][yy+y[i]]) a[xx+x[i]][yy+y[i]]=false,dfs(xx+x[i],yy+y[i]); } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { cin>>q; if(q=='#') a[i][j]=false; else a[i][j]=true; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]) { ans++; dfs(i,j); a[i][j]=false; } printf("%d",ans); }