CCF 201604 2 俄羅斯方塊

2021-08-28 18:22:44 字數 3251 閱讀 2444

問題描述

俄羅斯方塊是俄羅斯人阿列克謝·帕基特諾夫發明的一款休閒遊戲。

遊戲在乙個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

題目分析

這個題目就是簡單的模擬, 沒涉及到什麼演算法, 但是得滿分也是要除錯一會兒時間的

部分變數說明map  輸入的原始地圖

add  輸入的4*4方格

addmap 是乙個 "平行" 於map的乙個新陣列, 所謂的 "平行" 是指和map的行和列同步,但資料不再map中

(1) 先將add放入addmap對應的位置中, 然後對addmap操作, 一開始add放在addmap的前四行(初始位置,還沒移動)

(2) 寫乙個check()函式用來判斷新加入的圖形能否向下移, 判斷條件是addmap每乙個為1的方格下方不能是1,不然就碰撞了

(3) 如果能移動, 則執行movedown, 將addmap中的add向下移動一格

(4)當然, 如果小方格下方是空白的, 則不會發生碰撞, 不能一直移動, 不然就移過頭了

所以再加乙個條件, 移動的次數+add最大行數<=15, add最大行數是指實際的行數, 比如題目中給的add最大行數為3, 因為最後一行為0, 不計入其中, 這裡也許有人問, 那最上層為0呢, 因為add是向下移動, 最上層不必要考慮

(5) 直到最後不能移動時(發生碰撞 或者 到達邊界), 將map和addmap和二為一即是最終結果

如果對addmap還不是很清楚什麼概念, 可以在while中輸出addmap, 就能看到addmap每一次輸出的狀態

如**中while中注釋部分print(), 但如要輸出addmap注意將print()中的map改為addmap

#includeusing namespace std;

int map[20][20], addmap[20][20],add[10][10];

int n;

int step=0; //記錄向下移動的步數

bool check() //檢查是否能往下移

void movedown() //addmap向下移動一格

void print() //結果輸出

}int main()

//cout <<"end=" <> n;

for (int i = 1; i <= 4;i++)

for (int j = 1; j <= 4; j++)

addmap[i][n+j-1] = add[i][j]; //將add放到addmap中

while (check()&&end+step<15) //end+step應小於15,考慮到一直不會發生碰撞, 這裡不是end+step<=15, 不然又進入迴圈執行movedown時step+1, 那麼end+step=16了

for (int i = 1; i <= 15; i++)

for (int j = 1; j <= 10; j++)

map[i][j] += addmap[i][j]; //因為map和ad***是分開的兩張圖, 最後合併在一起

print();

return 0;

}

ccf201604 2 俄羅斯方塊

toc試題編號 201604 2 試題名稱 俄羅斯方塊 時間限制 1.0s 記憶體限制 256.0mb 問題描述 問題描述 俄羅斯方塊是俄羅斯人阿列克謝 帕基特諾夫發明的一款休閒遊戲。遊戲在乙個15行10列的方格圖上進行,方格圖上的每乙個格仔可能已經放置了方塊,或者沒有放置方塊。每一輪,都會有乙個新...

CCF 201604 2 俄羅斯方塊

試題編號 201604 2 試題名稱 俄羅斯方塊 時間限制 1.0s 記憶體限制 256.0mb 問題描述 俄羅斯方塊是俄羅斯人阿列克謝 帕基特諾夫發明的一款休閒遊戲。遊戲在乙個15行10列的方格圖上進行,方格圖上的每乙個格仔可能已經放置了方塊,或者沒有放置方塊。每一輪,都會有乙個新的由4個小方塊組...

CCF 201604 2 俄羅斯方塊

基礎模擬,迴圈結構,二維陣列 計算板塊1與地圖1最早接觸方塊的下降距離,就是板塊圖案的最大下降距離 用a陣列儲存地圖,c陣列儲存板塊中各點相對座標,板塊中方塊的列座標分別加上left 1為板塊中方塊在地圖中的初始座標,計算板塊方塊與地圖方塊相距最小的一列的上下兩方快距離,即為板塊整體下降距離 要注意...