1. 程式人生 > >CCF——俄羅斯方塊

CCF——俄羅斯方塊

問題描述   俄羅斯方塊是俄羅斯人阿列克謝·帕基特諾夫發明的一款休閒遊戲。
  遊戲在一個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>
#include<cstdio>
#include<stack>
#define MAX 1007
using namespace std;

bool g[15][10],t[4][4];
int main(){
	int sta,gh[4],th[4],m=100,mpos=0,sx,sy;
    for(int i=0;i<15;++i)
        for(int j=0;j<10;++j)
            cin>>g[i][j];
    for(int i=0;i<4;++i)
        for(int j=0;j<4;++j)
            cin>>t[i][j];
    cin>>sy;
    sy--;
    //統計出最先到達底部的方塊所在列
	for(int i=0;i<4;++i){
		//從上向下的第一個1
		int j=0; 
		while(j<15 && g[j][sy+i] == 0)++j;
		gh[i]=j;
	}
	
	for(int i=0;i<4;++i){
	     //從下往上的第一個1
		 int j=3;
		 while(j>=0 && t[j][i] == 0)--j;  //從0開始 
		 th[i]=j; 
	}
	
	for(int i=0;i<4;++i){
		if(th[i] == -1)continue;  //空列不管 
		int dis=gh[i]-th[i]-1;
		if(dis < m){
			m=dis;
			mpos=i;
		}
	}
	
	sx=gh[mpos]-th[mpos]-1;
	for(int i=0;i<4;++i){
	    if(sx+i>=15)break;  //注意可能為越界 
		for(int j=0;j<4;++j)
	        g[sx+i][sy+j] = max(g[sx+i][sy+j],t[i][j]);
	}
	for(int i=0;i<15;++i){
	    for(int j=0;j<9;++j)
	        cout<<g[i][j]<<" ";
	    cout<<g[i][9]<<endl;
	}
	return 0;
}