# 2015 Multi-University Training Contest 7 － Host by UESTC

## Problem F. Tetris

### Analysis:


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());
}
}


# HDU 4378. The battle on X-Star

### Brief description:

。。我們知道球面上兩點可以確定一個圓。。。球面上一個質心要做遠離該圓的運動。。。移動速度為 k × h。。（其中 h 為距離該圓的距離。。k 是常數。。。。
.. 問運動到距離該大圓最遠的位置所需要的時間。。