某岛

… : "…アッカリ~ン . .. . " .. .
August 15, 2015

2015 Multi-University Training Contest 7 - Host by UESTC

Problem F. Tetris

Brief description:

模拟俄罗斯方块游戏。

Analysis:

Dead-do


const int N = 12, M = 9;

bool G[20][20];

bool inGrid(int x, int y){
    return x >= 0 && y >= 0 && x < N && y < M;
}


struct T{
    VVII p; int x, y, z;
    void ww(){
        int zz = z;
        ++zz; if (zz == p.size()) zz = 0;
        ECH(it, p[zz]){
            int xx = x + it->fi, yy = y + it->se;
            if (!inGrid(xx, yy) || G[xx][yy]) return;
        }
        z = zz;
    }
    void aa(){
        //if (y == 0) return;
        --y; ECH(it, p[z]){
            int xx = x + it->fi, yy = y + it->se;
            if (!inGrid(xx, yy) || G[xx][yy]){
                ++y;
                return;
            }
        }
    }
    void dd(){
        //if (y != M-1) return;
        ++y; ECH(it, p[z]){
            int xx = x + it->fi, yy = y + it->se;
            if (!inGrid(xx, yy) || G[xx][yy]){
                --y;
                return;
            }
        }
    }
    bool ss(){

        //cout << "!?" << endl;

        ++x; ECH(it, p[z]){
            int xx = x + it->fi, yy = y + it->se;
            if (!inGrid(xx, yy) || G[xx][yy]){
                --x;
          //      cout << "aaa" << endl;
                return false;
            }
        }
        //cout << "aaa" << endl;
        return true;
    }
    void go(char c){
        if (c == 'w') ww();
        else if (c == 'a') aa();
        else if (c == 'd') dd();
        else if (c == 's') ss();
    }

    int eli(){

        //cout << "1" << endl;
        ECH(it, p[z]){
            int xx = x + it->fi, yy = y + it->se;
            //cout << z << " " << it->fi << " " << it->se << endl;
            //cout << xx << " " << yy << endl;
            G[xx][yy] = true;
        }
        //cout << "2" << endl;
        int z = 0; x = N-1; do{
            int j; REP_N(j, M) if (!G[x][j]) break;
            if (j == M){
                ++z; DWN_1(i, x, 1) REP(j, M) G[i][j] = G[i-1][j];
                REP(j, M) G[0][j] = 0;
            }
            else{
                --x;
            }
        } while (x >= 0);
        //cout << "3" << endl;
        return z;
    }

    void init(int t){

        x = 3, y = 3; z = 0; p.clear(); VII pp;

        if (t == 0){
            pp.PB(MP(0, 0));
            pp.PB(MP(0, 1));
            pp.PB(MP(-1, 0));
            pp.PB(MP(-1, 1));
            p.PB(pp);
        }
        else if (t == 1){
            pp.PB(MP(0, 0));
            pp.PB(MP(-1, 0));
            pp.PB(MP(-2, 0));
            pp.PB(MP(-3, 0));
            p.PB(pp);
            pp.clear();
            pp.PB(MP(0, 0));
            pp.PB(MP(0, 1));
            pp.PB(MP(0, 2));
            pp.PB(MP(0, 3));
            p.PB(pp);
        }
        else{
            pp.PB(MP(0, 0));
            pp.PB(MP(-1, 0));
            pp.PB(MP(0, 1));
            pp.PB(MP(0, 2));
            p.PB(pp);
            pp.clear();
            pp.PB(MP(0, 0));
            pp.PB(MP(-1, 0));
            pp.PB(MP(-2, 0));
            pp.PB(MP(-2, 1));
            p.PB(pp);
            pp.clear();
            pp.PB(MP(-1, 0));
            pp.PB(MP(-1, 1));
            pp.PB(MP(-1, 2));
            pp.PB(MP(0, 2));
            p.PB(pp);
            pp.clear();
            pp.PB(MP(0, 0));
            pp.PB(MP(0, 1));
            pp.PB(MP(-1, 1));
            pp.PB(MP(-2, 1));
            p.PB(pp);
        }
    }
} T;

char cmd[1009];

int Run(){
    RST(G); int n; RD(n); RS(cmd); int o = 0, s = 0; REP(i, n){
            T.init(RD()); do{
                if (!cmd[o]) return s;
                T.go(cmd[o++]);
            } while (T.ss());
            s += T.eli();


            /*REP(i, N){
                REP(j, M){

                    bool bj = false;
                    ECH(it, T.p[T.z]){
                        int x = T.x + it->fi, y = T.y + it->se;
                        if (i == x && y == j){
                            cout << "x";
                            bj = true;
                        }
                    }
                    if (!bj)
                    cout << G[i][j];
                }
                cout << endl;
            }
            cout << endl;*/


        }
}


int main() {

#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
#endif

    Rush{
        OT(Run());
    }
}