今天,你惹对象生气了吗
题号:NC21499
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
去年参加过校赛都知道,ly大人生气了,mxh就要采花哄对象去了,可怜的花田又要遭殃了。
有个神奇的地方有一片地,上下左右四个方向连起来的花形成了一片花地。
这一天,mxh又要采花哄对象啦,他找到了这片地,为了不踩到花,mxh很纠结怎么摘,最后他决定,利用自己神奇的闪现能力,闪现站在草上,摘所有上下左右可以摘到的花,原来有花或者种了花但是花被mxh摘了的,都没法闪现。
问:在mxh这么采摘之后,有多少块花地?
输入描述:
多组数据(不超过10组),读到文件结尾。 输入n,m(保证n,m不超过200),接下来n行,每行m个字符。 '.'表示草地 '#'表示花
输出描述:
一个整数表示花地的个数,行末输出换行
示例1
输入
复制
7 7 ....... .##.... .##.... ....##. ..####. ...###. .......
输出
复制
1
说明
经mxh采摘后,花地变为如下所示 ....... ....... ....... ....... ....#.. ....... ....... 所以还有一块花地
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
//void dfs(int a,int b){
// if(b==k) {
// ans++;
// return;
// }
// for(int i=a+1;i<=m*n;i++){
// int x=(i-1)/m+1;
// int y=(i-1)%m+1;
// if(s[x-1][y]==0&&s[x][y-1]==0){
// s[x][y]=1;
// dfs(i,b+1);
// s[x][y]=0;
// }
// }
//}
//bool is(long long x){
// if(x<=2) return true;
// for(long long i=2;i*i<x;i++){
// if(x%i==0) return false;
// }
// return true;
//}
//ll f(int x){
// if(x<2) return x;
// return (f(x/2)+f(x%2));
//}
//bool is(int x){
// int t=h/x;
// if(h%x!=0) t++;
// if(c-p*t<0){
// return false;
// }
// return true;
//}
//int sum;
//ll ff(ll n){
// if(n==1) return 1;
//
// return n*ff(n-1);
//}
//ll f(int n){
//
// while(n){
// sum+=n%10;
// n/=10;
// }
// if(n>=10){
// f(sum);
// }
// return sum;
//}
//const int MAXN = 305;
//const int INF = 0x3f3f3f3f;
//
//int love[MAXN][MAXN]; // 记录每个妹子和每个男生的好感度
//int ex_girl[MAXN]; // 每个妹子的期望值
//int ex_boy[MAXN]; // 每个男生的期望值
//bool vis_girl[MAXN]; // 记录每一轮匹配匹配过的女生
//bool vis_boy[MAXN]; // 记录每一轮匹配匹配过的男生
//int match[MAXN]; // 记录每个男生匹配到的妹子 如果没有则为-1
//int slack[MAXN]; // 记录每个汉子如果能被妹子倾心最少还需要多少期望值
//
//int N;
//
//
//bool dfs(int girl)
//{
// vis_girl[girl] = true;
//
// for (int boy = 0; boy < N; ++boy) {
//
// if (vis_boy[boy]) continue; // 每一轮匹配 每个男生只尝试一次
//
// int gap = ex_girl[girl] + ex_boy[boy] - love[girl][boy];
//
// if (gap == 0) { // 如果符合要求
// vis_boy[boy] = true;
// if (match[boy] == -1 || dfs( match[boy] )) { // 找到一个没有匹配的男生 或者该男生的妹子可以找到其他人
// match[boy] = girl;
// return true;
// }
// } else {
// slack[boy] = min(slack[boy], gap); // slack 可以理解为该男生要得到女生的倾心 还需多少期望值 取最小值 备胎的样子【捂脸
// }
// }
//
// return false;
//}
//
//int KM()
//{
// memset(match, -1, sizeof match); // 初始每个男生都没有匹配的女生
// memset(ex_boy, 0, sizeof ex_boy); // 初始每个男生的期望值为0
//
// // 每个女生的初始期望值是与她相连的男生最大的好感度
// for (int i = 0; i < N; ++i) {
// ex_girl[i] = love[i][0];
// for (int j = 1; j < N; ++j) {
// ex_girl[i] = max(ex_girl[i], love[i][j]);
// }
// }
//
// // 尝试为每一个女生解决归宿问题
// for (int i = 0; i < N; ++i) {
//
// fill(slack, slack + N, INF); // 因为要取最小值 初始化为无穷大
//
// while (1) {
// // 为每个女生解决归宿问题的方法是 :如果找不到就降低期望值,直到找到为止
//
// // 记录每轮匹配中男生女生是否被尝试匹配过
// memset(vis_girl, false, sizeof vis_girl);
// memset(vis_boy, false, sizeof vis_boy);
//
// if (dfs(i)) break; // 找到归宿 退出
//
// // 如果不能找到 就降低期望值
// // 最小可降低的期望值
// int d = INF;
// for (int j = 0; j < N; ++j)
// if (!vis_boy[j]) d = min(d, slack[j]);
//
// for (int j = 0; j < N; ++j) {
// // 所有访问过的女生降低期望值
// if (vis_girl[j]) ex_girl[j] -= d;
//
// // 所有访问过的男生增加期望值
// if (vis_boy[j]) ex_boy[j] += d;
// // 没有访问过的boy 因为girl们的期望值降低,距离得到女生倾心又进了一步!
// else slack[j] -= d;
// }
// }
// }
//
// // 匹配完成 求出所有配对的好感度的和
// int res = 0;
// for (int i = 0; i < N; ++i)
// res += love[ match[i] ][i];
//
// return res;
//}
//int check(int mid){
// int res=1;
// int p=a[1];
// for(int i=2;i<=n;i++){
// if(a[i]-p>=mid){
// res++;
// p=a[i];
// }
// }
// return res>=m;
//}
using namespace std;
char a[100][100];
int n,m,x,y;
int b[4][2]={{0,1},{-1,0},{1,0},{0,-1}};
void dfs(int x,int y){
a[x][y]='@';
for(int i=0;i<4;i++){
int xx=x+b[i][0];
int yy=y+b[i][1];
if(x<0||x>=n||y<0||y>=m){
continue;
}
else {
if(a[xx][yy]=='#'){
dfs(xx,yy);
}
}
}
}
int main()
{
while(scanf("%d %d",&n,&m)==2){
memset(a, 0, sizeof(a));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]=='#'){
if(a[i-1][j]=='.'||a[i+1][j]=='.'||a[i][j-1]=='.'||a[i][j+1]=='.'){
a[i][j]='@';
}
}
}
}
int res=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]=='#'){
res++;
dfs(i, j);
}
}
}
cout<<res<<endl;
}
}