ccf160402 俄羅斯方塊

2022-05-21 16:12:08 字數 3118 閱讀 6468

題目

問題描述

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

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

思路

1.解題的重點是找到第乙個與方塊接觸到的位置,找到這個位置後,因為方塊是乙個整體,確定停留首先與方格圖中為1的格仔接觸到的方塊,其他的也依次就被安置在這裡了。 

2.要注意的有幾個點:1)將最下面的一行置1,這樣如果這個方塊剛好落的位置本來沒有格仔為1,也不會因為找不到1而一直往下移;

3)我一開始寫的判斷條件,只是循壞每個塊,想法是找到先接觸。本身塊的行列定位就是按從下往上來的,但是如果存在上方的小塊先碰到格仔,我原來的演算法就沒有判斷,因此之前一直是70分。然後就是進行一下判斷,迴圈四個小塊,找到每個小塊先碰到的格仔,確保最終的格仔,是行號最小的(最先碰到)。就可以100分啦!

3.並且發現自己對二維陣列的用法都很模糊了。。。複習一下。(這個鏈結講得很清楚,

定義乙個三行四列的二維陣列,stu[3][4],3 行的編號為 0〜2,而 4 列的編號則為 0〜3行和列的元素值都是從0開始的

也就是元素值是從stu[

0][0],到stu[2][3

]。我之前一直試圖從1開始覺得會更好理解,結果......理解是好理解,輸出就亂了

題解

#includeusing

namespace

std;

struct

block;

intmain()

}for(int j=0;j<10;j++)

int add[4][4

];

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

}

block blocks[4];

int k=1

;

//處理板塊,最下面一行是有元素的

for(int i=3;i>=0;i--)}}

intn;

scanf("%d

",&n);//

最左邊開始的時候是在方格圖的哪一列中

int m;//

掉到哪一行

//處理板塊掉落,只關注板塊的最左列和最右列

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

if(m>j-1)    

break;}}

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

//輸出結果

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

printf("%d

",before[i][j]);

}printf("\n

");}

return0;

}

CCF 俄羅斯方塊

問題描述 俄羅斯方塊是俄羅斯人阿列克謝 帕基特諾夫發明的一款休閒遊戲。遊戲在乙個15行10列的方格圖上進行,方格圖上的每乙個格仔可能已經放置了方塊,或者沒有放置方塊。每一輪,都會有乙個新的由4個小方塊組成的板塊從方格圖的上方落下,玩家可以操作板塊左右移動放到合適的位置,當板塊中某乙個方塊的下邊緣與方...

CCF俄羅斯方塊

問題描述 俄羅斯方塊是俄羅斯人阿列克謝 帕基特諾夫發明的一款休閒遊戲。遊戲在乙個15行10列的方格圖上進行,方格圖上的每乙個格仔可能已經放置了方塊,或者沒有放置方塊。每一輪,都會有乙個新的由4個小方塊組成的板塊從方格圖的上方落下,玩家可以操作板塊左右移動放到合適的位置,當板塊中某乙個方塊的下邊緣與方...

CCF俄羅斯方塊

問題描述 俄羅斯方塊是俄羅斯人阿列克謝 帕基特諾夫發明的一款休閒遊戲。遊戲在乙個15行10列的方格圖上進行,方格圖上的每乙個格仔可能已經放置了方塊,或者沒有放置方塊。每一輪,都會有乙個新的由4個小方塊組成的板塊從方格圖的上方落下,玩家可以操作板塊左右移動放到合適的位置,當板塊中某乙個方塊的下邊緣與方...