試題編號: | 201604-2 |
試題名稱: | 俄羅斯方塊 |
時間限制: | 1.0s |
內存限制: | 256.0MB |
問題描述: |
問題描述
俄羅斯方塊是俄羅斯人阿列克謝·帕基特諾夫發明的一款休閒遊戲。
遊戲在一個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 |
問題描述:編寫一個程序來模擬小方塊下落的過程。
問題分析:這是一個模擬題,模擬俄羅斯方塊遊戲中,小方塊下落的過程。該問題比實際的俄羅斯方塊遊戲簡單多了。關鍵在於數據表示,然後就是模擬小方塊的下落過程。
程序說明:
本題只需要考慮板塊圖案所在的四列,不必考慮其餘幾列。求出四列中每一列的“距離”,即該列下落板塊中最下一個方塊(下界)與該列已存在方塊中最上一個方塊(上界)的“距離”。四列中以最短的距離所在列爲基準,求出這個最短距離。於是這個4*4方塊中所有爲1的方格均“下落”這個最短距離。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] s = new int[15][10];
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 10; j++) {
s[i][j] = sc.nextInt();
}
}
int[][] t = new int[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
t[i][j] = sc.nextInt();
}
}
int x = sc.nextInt();
x--;
// get height difference of each column
int minValue = 16;
for (int i = 0; i < 4; i++) {
// shangjie
int sj = -1;
for (int j = 0; j < 4; j++) {
if (t[j][i] == 1)
sj = j;
}
// height difference
if (sj == -1)
continue;
// xiajie
int xj = 15;
for (int j = 0; j < 11; j++) {
if (s[14 - j][x + i] == 1) {
xj = 14 - j;
}
}
if (xj - sj < minValue) {
minValue = xj - sj;
}
}
for (int i = 0; i < 4; i++) { // column
for (int j = 0; j < 4; j++) { // row
if (t[j][i] == 1) {
s[j + minValue - 1][i + x] = 1;
}
}
}
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 10; j++) {
System.out.print(s[i][j] + " ");
}
System.out.println();
}
sc.close();
}
}