CSP 俄羅斯方塊(201604-2)

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

思路
一種方法是像遊戲中的那樣模擬逐步下落,每次判斷是否與原有方塊重疊。須要注意的是原有方塊可能都是空白。
另外一種方法是直接經過計算原有方塊每列最高點的位置和掉落方塊每列最低點的位置來判斷掉落方塊會在哪一行停住。因此直接經過計算每列方塊的長度(準確的說應該是掉落方塊最低點的相對長度,原有方塊最高點的相對長度)。
圖一中所示原有長度爲5 2 3。掉落方塊長度爲1 1 2。疊加長度爲6 3 5,即掉落方塊的最高點爲6;
圖二中所示原有長度爲5 2。掉落方塊長度爲3 3。疊加長度爲8 5,即掉落方塊的最高點爲8。
 
第二種思路代碼以下:
 
 1 #include<iostream>
 2 using namespace std;
 3 
 4 int main(){
 5     int a[15][10];
 6     int in[4][4];
 7     for(int i=0;i<15;i++){
 8         for(int j=0;j<10;j++){
 9             cin>>a[i][j];
10         }
11     }
12     for(int i=0;i<4;i++){
13         for(int j=0;j<4;j++){
14             cin>>in[i][j];
15         }
16     }
17     int n;
18     cin>>n;
19     
20     int m[4];
21     for(int i=0;i<4;i++){            //計算掉落方塊每列的相對長度
22         m[i]=0;
23         for(int j=0;j<4;j++){
24             if(in[j][i]==1) m[i]=j+1;
25         }
26     }
27     int f[4];
28     for(int i=n-1;i<n+3;i++){        //計算原有方塊每列的相對長度
29         f[i-n+1]=0;
30         for(int j=0;j<15;j++){
31             if(a[j][i]==1){
32                 f[i-n+1]=15-j;
33                 break;
34             }
35         }
36     }
37     int max=0;
38     for(int i=0;i<4;i++){      //計算最大長度,即掉落方塊的最高點 
39         if(m[i]!=0&&m[i]+f[i]>=max){
40             max=m[i]+f[i];
41         }
42     }
43     for(int i=0;i<4;i++){          
44         for(int j=0;j<4;j++){
45             if(in[i][j]) a[15-max+i][n-1+j]=1;
46         }
47     }
48     for(int i=0;i<15;i++){
49         for(int j=0;j<10;j++){
50             cout<<a[i][j]<<" ";
51         }
52         cout<<endl;
53     }
54     return 0;
55 }

 第一種思路的代碼:ios

 1 #include<stdio.h>
 2 int a[19][10],b[4][4];
 3 int compareBlock(int r,int c){
 4     for(int i=0;i<4;i++){
 5         for(int j=0;j<4;j++){
 6             if(b[i][j]==1&&a[i+r][j+c]==1) return 1;
 7         }
 8     }
 9     return 0;
10 } 
11 int main()
12 {
13     for(int i=15;i<19;i++){
14         for(int j=0;j<10;j++){
15             a[i][j]=1;
16         }
17     } 
18     int n,temp=0;
19     for(int i=0;i<15;i++)
20     {
21         for(int j=0;j<10;j++)
22         {
23             scanf("%d",&a[i][j]);
24         } 
25     }
26     for(int i=0;i<4;i++)
27     {
28         for(int j=0;j<4;j++)
29         {
30             scanf("%d",&b[i][j]);
31         } 
32     }
33     scanf("%d",&n);
34     int mark;
35      
36     for(int i=0;i<=14;i++)
37     {
38         if(compareBlock(i,n-1)) break;
39         mark=i;
40     }
41     for(int i=0;i<4;i++){
42         for(int j=0;j<4;j++){
43             if(b[i][j]==1) a[mark+i][n-1+j]=1;
44         }
45     }
46     for(int i=0;i<15;i++){
47         for(int j=0;j<10;j++){
48             printf("%d ",a[i][j]);
49         }
50         printf("\n");
51     }
52     return 0;
53 } 
相關文章
相關標籤/搜索