AOJ0178 TETORIS

問題リンク TETORIS

  • 解法

実装問題です。
ブロックを置くロジックと、行を消すロジックの2つをがんばって作ります。
行が揃っていたら、それより上の行全てを1段下にずらします。これを続けられるだけ続けます。

  • ソース
import java.util.Scanner;

//TETORIS
public class AOJ0178 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true){
			int n = sc.nextInt();
			if(n==0)break;
			boolean[][] m = new boolean[5000][5];
			while(n--!=0){
				int d = sc.nextInt();
				int p = sc.nextInt();
				int q = sc.nextInt()-1;
				if(d==2){
					int k = 4999;
					while(k>=0&&!m[k][q])k--;
					k++;
					for(int i=k;i<k+p;i++)m[i][q]=true;
				}
				else{
					int k = 4999;
					while(true){
						boolean f = true;
						if(k>=0){
							for(int j=q;j<q+p;j++){
								if(m[k][j])f = false;
							}
						}
						if(!f||k==-1){
							k++;
							for(int j=q;j<q+p;j++)m[k][j]=true;
							break;
						}
						k--;
					}
				}
				boolean con = true;
				int k = 0;
				while(k<5000&&con){
					con = false;
					boolean t = true;
					for(int j=0;j<5;j++){
						if(m[k][j])con = true;
						else t = false;
					}
					if(t){
						boolean f = true;
						int i = k;
						while(i<5000&&f){
							f = false;
							for(int j=0;j<5;j++){
								if(m[i][j])f = true;
							}
							if(f){
								for(int j=0;j<5;j++){
									m[i][j] = m[i+1][j];
								}
							}
							i++;
						}
					}
					else k++;
				}
			}
			int s = 0;
			for(int i=0;i<5000;i++)for(int j=0;j<5;j++)s+=m[i][j]?1:0;
			System.out.println(s);
		}
	}
}