AOJ 0178 テトリス
reading-hard & 実装に工夫が必要
#include <iostream> #include <algorithm> #include <vector> #include <set> using namespace std; int n; int h[7]; bool m[6010][7]; int b[1010][5]; int main() { while (true) { cin >> n; if (n == 0) break; for (int i = 0; i < 5500; i++) { for (int j = 0; j < 7; j++) m[i][j] = false; } for (int i = 0; i <= 6; i++) { h[i] = 0; } int ans = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < 3; j++) { cin >> b[i][j]; if (j == 1) { ans += b[i][j]; } } } for(int i = 0;i < n;i++){ if(b[i][0] == 1){ int hmax = h[b[i][2]]; for(int j = 0;j < b[i][1];j++){ hmax = max(hmax,h[b[i][2]+j]); } hmax++; for(int j = 0;j < b[i][1];j++){ h[b[i][2]+j] = hmax; m[hmax][b[i][2]+j] = true; } }else{ int hmax = h[b[i][2]]; for(int j = 1;j <= b[i][1];j++){ m[hmax+j][b[i][2]] = true; } h[b[i][2]] = hmax + b[i][1]; } int hmax = h[1]; for(int j = 1;j <= 5;j++) hmax = max(hmax,h[j]); set<int> s; for(int j = 1;j <= hmax;j++){ int count = 0; for(int k = 1;k <= 5;k++)if(m[j][k] == true)count++; if(count == 5){ ans -= 5; s.insert(j); } } int nj = 1; for(int j = 1;j <= hmax;j++){ if( s.find(j) != s.end() )continue; for(int k = 1;k <= 5;k++){ m[nj][k] = m[j][k]; } nj++; } for(int j = nj;j < 5050;j++){ for(int k = 1;k <= 5;k++)m[j][k] = false; } for(int j = 1;j <= 5;j++){ h[j] = 0; for(int k = hmax;k >= 0;k--){ if(m[k][j] == true){ h[j] = k; break; } } } } int hmax = h[1]; for(int j = 1;j <= 5;j++) hmax = max(hmax,h[j]); for(int j = hmax;j >= 1;j--){ } cout << ans << endl; } }