1. 程式人生 > >201604-2俄羅斯方塊

201604-2俄羅斯方塊

一、原題

問題描述
試題編號: 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
二、分析

這是一道簽到題。我23:06開始做,23:50才做完,耗時44分鐘,上一道2題也是耗時40分鐘。看樣子我的水平不夠。那麼我們來看看進步空間吧。我23:34分第一次提交,說明那時候我已經把做題的思路理清楚了。也就是說,我如果不出錯的話,做這道題目需要28分鐘,剩下的16分鐘時間,我都是在挑bug。我框框裡面寫了後不敢提交,應為這次我學聰明瞭,我知道必然會編譯錯,即使過了編譯也是錯誤,於是直接上了編譯器。

那麼是什麼bug呢?說來很可笑。

編譯時出錯發現nb兩個地方都寫了++,於是越界。編譯器上測試時順便發現了c應該--才行,給出的是從1開始數的數字,不是從0。

第一次提交後發現的bug:i==3||board[i+1][j]==0,我當時寫成了j==3||board[i][j+1]==1,然後我改成了i==3||board[i+1][j]==1

然後,得分就下降了40分,成了20分。。因為我的原來判斷條件寫錯了,如果兩個都寫錯的話,那麼測試樣例是可以過的,因為那個7中間那裡會被檢測到,但是改正確後就不行了,因為只有7拐彎那裡會被檢測到,於是就掛了。起始我條件寫錯了,應該是這個是1,下一行是0,這裡應該判斷0000000000,1在上面判斷過了。把1改成0,啪啪啪,就過了,完全正確。其實吧,困擾我們的一般不是思路和演算法,而是一堆堆這種0寫成1,i成j的小bug,還有從0開始和從1開始數數的區別,還有nb這種不小心多寫了++的東西。


#include <iostream>
using namespace std;
int mapp[15][10]={};
int board[4][4]={};
int r=0,c=0;
bool notend(){
int bot[4][2];
int i,j,k;
for(i=0;i<4;i++){
for(j=0;j<2;j++){
bot[i][j]=-1;
}
}
int nb=0;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(board[i][j]==1){
if(i==3||board[i+1][j]==0){
bot[nb][0]=i;bot[nb++][1]=j;
}
}
}
}
for(i=0;i<nb;i++){
int rr=r+bot[i][0];int cc=c+bot[i][1];
if(rr==14||mapp[rr+1][cc]==1){
for(j=0;j<4;j++){
for(k=0;k<4;k++){
if(board[j][k]==1){
mapp[r+j][c+k]=1;
}
}
}
return 0;
}
}
return 1;
}
int main(){
int i,j;
for(i=0;i<15;i++){
for(j=0;j<10;j++){
cin>>mapp[i][j];
}
}
for(i=0;i<4;i++){
for(j=0;j<4;j++){
cin>>board[i][j];
}
}
cin>>c;c--;
while(notend()){
r++;
}
for(i=0;i<15;i++){
for(j=0;j<10;j++){
cout<<mapp[i][j]<<" ";
}
cout<<endl;
}
return 0;
}