牛客 模拟战役(dfs)
求一下连通块后贪心
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; typedef long long ll; const int N=3e5+10; const int mod=1000000007; int pos1[N]; int pos[N]; int st[20][2200]; string s[10]; int num; int m; void dfs1(int a,int b){ if(s[a][b]=='.') return ; if(s[a][b]=='*'&&!st[a][b]){ num++; st[a][b]=1; } else{ return ; } int i,j; for(i=-1;i<=1;i++){ for(j=-1;j<=1;j++){ int x=a+i,y=b+j; if(!i&&!j) continue; if(x>0&&x<5&&y>=0&&y<m){ dfs1(x,y); } } } } void dfs2(int a,int b){ if(s[a][b]=='.') return ; if(s[a][b]=='*'&&!st[a][b]){ num++; st[a][b]=1; } else{ return ; } int i,j; for(i=-1;i<=1;i++){ for(j=-1;j<=1;j++){ int x=a+i,y=b+j; if(!i&&!j) continue; if(x>4&&x<=8&&y>=0&&y<m){ dfs2(x,y); } } } } int main(){ cin>>m; int i,j; for(i=1;i<=4;i++){ cin>>s[i]; } for(i=5;i<=8;i++){ cin>>s[i]; } int cnt=0; for(i=1;i<=4;i++){ for(j=0;j<m;j++){ if(s[i][j]=='*'&&!st[i][j]){ num=0; dfs1(i,j); pos[cnt++]=num; } } } int tmp=cnt; cnt=0; for(i=5;i<=8;i++){ for(j=0;j<m;j++){ num=0; if(s[i][j]=='*'&&!st[i][j]){ dfs2(i,j); pos1[cnt++]=num; } } } sort(pos1,pos1+cnt); if(cnt<tmp) cout<<-1<<endl; else{ int res=0; for(i=tmp-1;i<cnt;i++) res+=pos1[i]; cout<<res<<endl; } }
没有人不辛苦,只有人不喊疼