試題編號: | 201604-2 |
試題名稱: | 俄羅斯方塊 |
時間限制: | 1.0s |
內存限制: | 256.0MB |
問題描述: | 問題描述 俄羅斯方塊是俄羅斯人阿列克謝·帕基特諾夫發明的一款休閑游戲?! ∮螒蛟谝粋€15行10列的方格圖上進行,方格圖上的每一個格子可能已經放置了方塊,或者沒有放置方塊。每一輪,都會有一個新的由4個小方塊組成的板塊從方格圖的上方落下,玩家可以操作板塊左右移動放到合適的位置,當板塊中某一個方塊的下邊緣與方格圖上的方塊上邊緣重合或者達到下邊界時,板塊不再移動,如果此時方格圖的某一行全放滿了方塊,則該行被消除并得分?! ≡谶@個問題中,你需要寫一個程序來模擬板塊下落,你不需要處理玩家的操作,也不需要處理消行和得分?! 【唧w的,給定一個初始的方格圖,以及一個板塊的形狀和它下落的初始位置,你要給出最終的方格圖。輸入格式 輸入的前15行包含初始的方格圖,每行包含10個數字,相鄰的數字用空格分隔。如果一個數字是0,表示對應的方格中沒有方塊,如果數字是1,則表示初始的時候有方塊。輸入保證前4行中的數字都是0。 輸入的第16至第19行包含新加入的板塊的形狀,每行包含4個數字,組成了板塊圖案,同樣0表示沒方塊,1表示有方塊。輸入保證板塊的圖案中正好包含4個方塊,且4個方塊是連在一起的(準確的說,4個方塊是四連通的,即給定的板塊是俄羅斯方塊的標準板塊)?! 〉?0行包含一個1到7之間的整數,表示板塊圖案最左邊開始的時候是在方格圖的哪一列中。注意,這里的板塊圖案指的是16至19行所輸入的板塊圖案,如果板塊圖案的最左邊一列全是0,則它的左邊和實際所表示的板塊的左邊是不一致的(見樣例)輸出格式 輸出15行,每行10個數字,相鄰的數字之間用一個空格分隔,表示板塊下落后的方格圖。注意,你不需要處理最終的消行。樣例輸入0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 0 00 0 0 0 0 0 1 0 0 00 0 0 0 0 0 1 0 0 01 1 1 0 0 0 1 1 1 10 0 0 0 1 0 0 0 0 00 0 0 00 1 1 10 0 0 10 0 0 03樣例輸出0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 1 0 00 0 0 0 0 0 1 0 0 00 0 0 0 0 0 1 0 0 01 1 1 1 1 1 1 1 1 10 0 0 0 1 1 0 0 0 0 |
問題分析:關鍵是如何處理下落方塊下落的過程。方塊下落中遇到阻礙時應該怎么解決?在方塊下落中,從圖的第五行開始,從方塊的最下一行開始到第一行依次判斷其是否會與此行發生碰撞。若發生碰撞,則將方塊安放在發生碰撞的上一行,同時要注意下落方塊的那一行與圖發生了碰撞,以便安放在正確的位置。若沒有發生碰撞,則判斷圖的下一行是否會發生碰撞,同時繼續判斷下落方塊的上一行和圖的本行是否發生碰撞,直到判斷完下落方塊的所有行。
測試用例:
0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 01 1 1 1 0 1 1 1 1 10 0 0 0 1 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 1 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 00 1 1 10 0 1 00 0 1 03
代碼:
#include <iostream>#include <stdio.h>using namespace std;/* run this PRogram using the console pauser or add your own getch, system("pause") or input loop */int t[17][11];int block[5][5];int n=15,m=10;void load(int row,int col,int s){//0-s行 for(int i=0,p=row-s;i<=s;i++,p++){for(int j=0,q=col;j<4;j++,q++){if(block[i][j] == 1)t[p][q]=block[i][j];}}//s-3行for(int i=s+1,p=row+1;i<4;i++,p++){for(int j=0,q=col;j<4;j++,q++){if(block[i][j] == 1){t[p][q]=block[i][j];}}} }//void scan(int row,int col,int s)//{// //從圖的row行col列開始針對下落方塊的第s行掃描// for(int i=row;i<=n;i++)// {// for(int j=col,h=0;j<col+4;j++,h++)// {// if(t[i][j] == 1 && block[s][h]==1)// {// //方塊和圖內的方塊產生碰撞 // load(i-1,col,s); //產生碰撞則將方塊下落安置在碰撞產生的上一行// //即s行放在i-1行 // return; // } // }// } // //若s行在i<n的所有行中都沒有發生碰撞 那么s行就不可能和任何行發生碰撞 // //因此轉入對s行的上一行的判斷 // scan(row,col,s-1);//// if(s == 0)//// {//// //若下落方塊的最上一行也沒有發生碰撞 則方塊直接下落到最下一層 //// load(n-1,col,3);//// }// return; //} void scan(int row,int col){//從圖的row行col列開始針對下落方塊的第s行掃描for(int i=3;i>=0;i--) //下落方塊從第四行到第一行開始掃描 {for(int j=col,h=0;j<col+4;j++,h++){if(t[row][j]==1 && block[i][h] == 1){load(row-1,col,i);return;}}scan(row+1,col); }scan(row+1,col);}int main(int argc, char *argv[]) {//讀入圖 //while(true){ for(int i=0;i<n;i++){for(int j=0;j<m;j++){scanf("%d",&t[i][j]);}} for(int i=0;i<m;i++){t[15][i]=1;} //讀入下落塊 for(int i=0;i<4;i++){for(int j=0;j<4;j++){scanf("%d",&block[i][j]);}} int p;//初始下落位置 scanf("%d",&p);scan(4,p-1);for(int i=0;i<n;i++){int j;for(j=0;j<m-1;j++){printf("%d ",t[i][j]);}printf("%d",t[i][j]);printf("/n");}} return 0;}
新聞熱點
疑難解答