AOJ 0178 TETORIS

404 Not Found

簡易テトリスで安心した。大体ビットを使って表現。

なんとなくサイズ5の縦棒が大量にきた場合も溢れないように、配列のサイズ5000くらいにした。

bitはビットが立ってる本数を数える関数。最下位が63なのは消えない番兵として。

#include <iostream>
#include <vector>
using namespace std;

int bit(int bits) {
  bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
  bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
  bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
  bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);
  return (bits & 0x0000ffff) + (bits >>16 & 0x0000ffff);
}


int main(){
	int n,a,b,c,mask,ret;
	while(cin >> n && n){
		vector<int> data(5001,0);
		data[5000] = 63;
		ret = 0;
		while(n--){
			cin >> a >> b >> c;
			c--;
			if(a==1){
				mask  =  ( (1<<b)-1 ) << c;
				for(int i=0;i+1<data.size();i++){
					if(data[i+1] & mask){
						data[i] += mask;
						break;
					}
				}
			}else{
				mask  = 1 << c;
				for(int i=0;i+1<data.size();i++){
					if(data[i+1] & mask){
						for(int j=0;j<b;j++)
							data[i-j]+=mask;
						break;
					}
				}		
			}
			vector<int>::iterator it = data.begin();
			while(it != data.end()){
				if((*it) == 31){
					it = data.erase(it);
					it--;
				}
				it++;
			}
		}
		for(int i=0;i<data.size()-1;i++){
			ret += bit( data[i] );
		}
		cout << ret << endl;
	}
}