1. 程式人生 > >CCF201604 俄羅斯方塊(JAVA)

CCF201604 俄羅斯方塊(JAVA)

描述:

問題描述

  俄羅斯方塊是俄羅斯人阿列克謝·帕基特諾夫發明的一款休閒遊戲。
  遊戲在一個15行10列的方格圖上進行,方格圖上的每一個格子可能已經放置了方塊,或者沒有放置方塊。每一輪,都會有一個新的由4個小方塊組成的板塊從方格圖的上方落下,玩家可以操作板塊左右移動放到合適的位置,當板塊中某一個方塊的下邊緣與方格圖上的方塊上邊緣重合或者達到下邊界時,板塊不再移動,如果此時方格圖的某一行全放滿了方塊,則該行被消除並得分。
  在這個問題中,你需要寫一個程式來模擬板塊下落,你不需要處理玩家的操作,也不需要處理消行和得分。
  具體的,給定一個初始的方格圖,以及一個板塊的形狀和它下落的初始位置,你要給出最終的方格圖。

輸入格式

  輸入的前15行包含初始的方格圖,每行包含10個數字,相鄰的數字用空格分隔。如果一個數字是0,表示對應的方格中沒有方塊,如果數字是1,則表示初始的時候有方塊。輸入保證前4行中的數字都是0。
  輸入的第16至第19行包含新加入的板塊的形狀,每行包含4個數字,組成了板塊圖案,同樣0表示沒方塊,1表示有方塊。輸入保證板塊的圖案中正好包含4個方塊,且4個方塊是連在一起的(準確的說,4個方塊是四連通的,即給定的板塊是俄羅斯方塊的標準板塊)。
  第20行包含一個1到7之間的整數,表示板塊圖案最左邊開始的時候是在方格圖的哪一列中。注意,這裡的板塊圖案指的是16至19行所輸入的板塊圖案,如果板塊圖案的最左邊一列全是0,則它的左邊和實際所表示的板塊的左邊是不一致的(見樣例)

輸出格式

  輸出15行,每行10個數字,相鄰的數字之間用一個空格分隔,表示板塊下落後的方格圖。注意,你不需要處理最終的消行。

樣例輸入

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
1 1 1 0 0 0 1 1 1 1
0 0 0 0 1 0 0 0 0 0
0 0 0 0
0 1 1 1
0 0 0 1
0 0 0 0
3

樣例輸出

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
1 1 1 1 1 1 1 1 1 1
0 0 0 0 1 1 0 0 0 0

 

package tetris;

import java.util.Scanner;

public class Main {
	// 思路:模擬方塊下降,若存在空間則繼續下降,若空間被佔據則停止下降並得出最終結果
	@SuppressWarnings("resource")
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int[][] square = new int[15][10];// 遊戲方格
		int[][] block = new int[4][2];// 新方塊各部分座標值
		int bottom = 0;// 記錄新方塊的方格中位於最底部的部分
		for (int y = 0; y < 15; y++)
			// 佈景
			for (int x = 0; x < 10; x++)
				square[y][x] = sc.nextInt();
		int j = 0;// 下標
		for (int y = 0; y < 4; y++)
			// 記錄方塊座標
			for (int x = 0; x < 4; x++) {
				if (sc.nextInt() == 1) {
					block[j][0] = x;
					block[j][1] = y;
					bottom = block[bottom][1] > y ? bottom : j;// 比較縱座標取最大值
					j++;
				}
			}
		int column = sc.nextInt();// 下落的列
		for (int y = 0; y < 4; y++)// 將方塊各部分座標換成在遊戲方格中的初始座標
		{
			block[y][0] += (column - 1);
		}
		while (block[bottom][1] + 1 < 15)// 模擬方塊下落,直至到達最底部
		{
			if (square[block[0][1] + 1][block[0][0]] == 0
					&& square[block[1][1] + 1][block[1][0]] == 0
					&& square[block[2][1] + 1][block[2][0]] == 0
					&& square[block[3][1] + 1][block[3][0]] == 0)// 檢測空間是否被佔據
			{// 未被佔據則方塊繼續下落
				block[0][1]++;
				block[1][1]++;
				block[2][1]++;
				block[3][1]++;
			} else// 無法繼續下落
				break;
		}
		// 在遊戲方格中固定方塊位置
		square[block[0][1]][block[0][0]] = 1;
		square[block[1][1]][block[1][0]] = 1;
		square[block[2][1]][block[2][0]] = 1;
		square[block[3][1]][block[3][0]] = 1;
		for (int y = 0; y < 15; y++)// 輸出
		{
			for (int x = 0; x < 10; x++)
				System.out.print(square[y][x] + " ");
			System.out.println();
		}
	}

}