USACO SILVER::2018 December - Mooyo Mooyo

Mooyo Mooyo

Point

Design(x)

Big O(time)

Big O(memory)

Code(x)

#include<bits/stdc++.h>
#define endl '\n'
#define rep(i,a,b) for(int i=a;i<b;i++)
#define r_rep(i,a,b) for(int i=a;i>b;i--)
const int MAXN = 100+1, MAXM = 10+1;
const int dx[]={-1, 0, 1, 0}, dy[]={0, 1, 0, -1};
using namespace std;

int n, m, mxk;
int a[MAXN][MAXM];
bool visited[MAXN][MAXM];
queue<pair<int,int> > q, bq;
bool over(int x, int y){ return (x<0 || y<0 || x>=n || y>=m);}
void bfs(bool& nothing, const int sx, const int sy, const int colur){
    while(!q.empty()) q.pop();
    while(!bq.empty()) bq.pop();
    visited[sx][sy] = true;
    q.push({sx, sy});
    bq.push({sx, sy});
    while(!q.empty()){
        int x = q.front().first, y = q.front().second; q.pop();
        rep(i, 0, 4){
            int nx = x+dx[i], ny = y+dy[i];
            if(over(nx, ny) || visited[nx][ny] || a[nx][ny] != colur) continue;
            visited[nx][ny] = true;
            q.push({nx, ny});
            bq.push({nx, ny});
        }
    }
    if(bq.size() >= mxk){
        nothing = false;
        while(!bq.empty()){
            int x = bq.front().first, y = bq.front().second; bq.pop();
            a[x][y] = 0;
        }
    }
}
void PRINT(){
    rep(i, 0, n){
        rep(j, 0, m){
            cout << a[i][j];
        }cout << endl;
    }
}
void gravity(){
    int b[MAXN][MAXM]={0};
    rep(j, 0, m){
        int idx = n-1;
        r_rep(i, n-1, -1){
            if(a[i][j] != 0){
                b[idx--][j] = a[i][j];
            }
        }

    }
    memcpy(a, b, sizeof(b));
}
void solve(){
    bool NOTHING;
    while(true){
        NOTHING = true;
        memset(visited, false, sizeof(visited));
        // bfs
        rep(i, 0, n){
            rep(j, 0, m){
                if(visited[i][j] == false && a[i][j] != 0){
                    bfs(NOTHING, i, j, a[i][j]);
                }
            }
        }
        if(NOTHING) break;
        // gravity
        gravity();
    }
}
int main(){
    //freopen("input.txt", "r", stdin);
    m = 10;
    scanf("%d %d",&n,&mxk);
    rep(i, 0, n) rep(j, 0, m) scanf("%1d",&a[i][j]);
    solve();
    PRINT();
    return 0;
}