P5121 [USACO18DEC] Mooyo Mooyo S
>>>每次有连通块 就一次性删除 +下落+下落后再删除
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------debug\n"); using namespace std; int n,k,mark[110][15]; char ch[110][15]; int dx[]={0,-1,0,1,0}; int dy[]={0,0,1,0,-1}; int sum=0; void dfs(int x,int y,char s) { mark[x][y]=1; for(int i=1;i<=4;i++) { int nx=x+dx[i],ny=y+dy[i]; if(ch[nx][ny]==s&&mark[nx][ny]==0&&nx>=1&&nx<=n&&ny>=1&&ny<=10) sum++,dfs(nx,ny,s); } } void xialuo() { for(int i=n-1;i>=1;i--) { for(int j=1;j<=10;j++){ if(ch[i][j]!='0'){ int k=i; while(ch[k+1][j]=='0'&&k<=n){ k++; } if(k!=i){ ch[k][j]=ch[i][j]; ch[i][j]='0'; } } } } } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>k; for(int i=1;i<=n;i++) for(int j=1;j<=10;j++) cin>>ch[i][j]; int f=1; while(f)//2 { f=0; for(int i=1;i<=n;i++)// 1 ech time clear+xialuo { for(int j=1;j<=10;j++) { if(ch[i][j]!='0') { sum=1; memset(mark,0,sizeof(mark)); dfs(i,j,ch[i][j]); if(sum>=k){ for(int ii=1;ii<=n;ii++){ for(int jj=1;jj<=10;jj++){ if(mark[ii][jj]) ch[ii][jj]='0'; } } f=1; } } } } if(f==1) xialuo(); } for(int i=1;i<=n;i++) { for(int j=1;j<=10;j++) cout<<ch[i][j]; cout<<'\n'; } return 0; }
                    
                
                
            
        
浙公网安备 33010602011771号