列表

详情


NC14632. mxh道歉记

描述

众所周知,mxh是个帅气的基佬,但这几天他惹他可爱的女朋友lingyun生气啦!为了能够得到对象的原谅,mxh前往了花园采花以求得到lingyun的原谅,在花园中,mxh发现了花分成了好几块区域,每块区域的花都被青草围绕着,mxh想要尽可能地朵采摘一些花朵,然而花园管理员规定mxh只能前往其中一个区域,规定花园的长度和宽度分别为N和M(1≤N,M≤30),那么请告诉mxh花园里的花朵们分成了多少块区域?拥有最多的花的区域究竟有多少朵花呢?(#是青草,*是花朵)

输入描述

第一行输入花园的长N和宽M,(1≤N,M≤30)
接下来N行对应输入花园的情况(#是青草,*是花朵)

输出描述

输出2个数,第一个表示花园内的花朵形成了多少块区域,第二个表示拥有最多的花的区域究竟有多少朵花

示例1

输入:

5 5
####*
#**#*
#*##*
***#*
**##*

输出:

2 8

说明:

如果一朵花都没有则输出0 0
(本校内写出此题的,来加我qq,我送你些东西!!!)

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 496K, 提交时间: 2020-06-15 15:51:55

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,n) for(register int i=a;i<=n;++i)
string s[30];
int n,m;
bool judge(int x,int y){
    return x>=0&&y>=0&&x<n&&y<m&&s[x][y]=='*';
}
int xx[8]={1,-1,0,0,1,1,-1,-1};
int yy[8]={0,0,1,-1,-1,1,-1,1};
int dfs(int x,int y){
    s[x][y]='#';
    //cout<<x<<" "<<y<<endl;
    int s=1;
    rep(i,0,7){
        int tx=x+xx[i],ty=y+yy[i];
        s+=judge(tx,ty)?dfs(tx,ty):0;
    }
    return s;
    //return judge(x,y)?dfs(x+xx[0],y+yy[0])+dfs(x+xx[1],y+yy[1])+dfs(x+xx[2],y+yy[2])+dfs(x+xx[3],y+yy[3])+1:0;
    //_[x][y]=1;
}
int main(){
    std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int qu=0,hua=0,x=0;
    cin>>n>>m;
    rep(i,0,n-1)cin>>s[i];
    rep(i,0,n-1)rep(j,0,m-1){
        if(s[i][j]=='*'){
            x=dfs(i,j);
            hua=max(x,hua);
            if(x!=0)qu++;
        }
    }
    cout<<qu<<" "<<hua;
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 384K, 提交时间: 2017-12-17 16:16:21

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,k=0,cnt=0,ok=0;
char hy[3000][100]={0};
void dfs(int x,int y){
	hy[x][y]='#';
	ok++;
	for(int dx=-1;dx<=1;dx++){
		for(int dy=-1;dy<=1;dy++){
			int nx=x+dx,ny=y+dy;
			if(nx<n&&ny<m&&nx>=0&&ny>=0&&hy[nx][ny]=='*') dfs(nx,ny);
		}
	}
}
int main(){
	cin>>n>>m;
	int i,j;
	int max[1000]={0};
	for(i=0;i<n;i++){
		cin>>hy[i];
	}
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			if(hy[i][j]=='*'){
				dfs(i,j);
				max[k++]=ok;
				ok=0;
				cnt++;
			}
		}
	}
	int max1=0;
	for(i=0;i<k;i++){
		if(max1<max[i]) max1=max[i];
	}
	cout<<cnt<<" "<<max1<<endl;
	return 0;
}

上一题