【3星難度】C++程序設計:俄羅斯方塊(模擬方塊下落,經典問題)

【問題描述】

  俄羅斯方塊是俄羅斯人阿列克謝·帕基特諾夫發明的一款休閒遊戲。
  遊戲在一個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

#include <iostream>
using namespace std;
int main() {
	int a[15][10];//初始方格圖 
	int i,j;
	for(i=0; i<15; i++)
		for(j=0; j<10; j++)
			cin>>a[i][j];
	int b[4][4];//下落中的板塊 
	for(i=0; i<4; i++)
		for(j=0; j<4; j++)
			cin>>b[i][j];
	int place;//下落板塊的左右位置(橫座標,題目中從1開始)
	cin>>place;
	int step;//下落板塊的上下位置(縱座標,設爲從1開始)
	for(step=1; step<16; step++)
		for(i=step-1; i<step+3; i++) //step從1開始,對應於數組從0開始 
			for(j=place-1; j<place+3; j++) //place從1開始,對應於數組從0開始 
				//一步步模擬下落,直至發生衝突(同一位置兩個1) 
				if(a[i][j]+b[i-(step-1)][j-(place-1)]==2)
					goto here;
here:
	//回退一步,即爲最終位置 
	step-=1;
	for(i=step-1; i<step+3; i++)
		for(j=place-1; j<place+3; j++)
			if (b[i-step+1][j-place+1]==1)
				//計算最終方格圖 
				a[i][j]=b[i-step+1][j-place+1];
	for(i=0; i<15; i++) {
		for(j=0; j<10; j++)
			cout<<a[i][j]<<" ";
		cout<<endl;
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章