NC21499-今天,你惹对象生气了吗(dfs)

今天,你惹对象生气了吗

题号: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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭晋龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值