NC14632. mxh道歉记
描述
输入描述
第一行输入花园的长N和宽M,(1≤N,M≤30)
接下来N行对应输入花园的情况(#是青草,*是花朵)
输出描述
输出2个数,第一个表示花园内的花朵形成了多少块区域,第二个表示拥有最多的花的区域究竟有多少朵花
示例1
输入:
5 5 ####* #**#* #*##* ***#* **##*
输出:
2 8
说明:
如果一朵花都没有则输出0 0C++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; }