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

CCF 201604-2 俄羅斯方塊

img -s font local 圖片 log 為什麽 mem height

CCF 201604-2 俄羅斯方塊

  記板塊圖案最左邊開始的時候是在方格圖的哪一列為local,計算從local開始向右的四列,最多能落下的距離,取四個中的最小值,作為整個板塊圖的下落距離。

  註意,由於板塊圖的最後一行不一定有方塊,所以,找到每一列最下面的方塊,將其行號記錄在數組b[4]中。相應的方格圖中的四列最上面的方塊的行號記錄在數組s[4]中。min( s[i] - b[i] )即為板塊圖最長下落的距離。

  木塊停止的可能有兩條:“當板塊中某一個方塊的下邊緣與方格圖上的方塊上邊緣重合或者達到下邊界時,板塊不再移動”,將他劃歸成一條,將記錄方格圖的數組square[15][10]再加上一行,為square[16][10],將最後一行全存1,這樣就可以將停止條件變為“當板塊中某一個方塊的下邊緣與方格圖上的方塊上邊緣重合,板塊不再移動”

  但是為什麽只得了90分。。。啊天哪!什麽情況沒考慮到吧。。暫留問題

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 int square[16][10];
 5 int block[4][4];
 6 void solve(int local)
 7 {
 8     int s[4]; 
 9     memset(s,-1,sizeof(s));
10     ///square上的4列 
11     for(int i=local-1;i<local+3;i++)
12 { 13 for(int j = 0;j<16;j++) 14 {///找每一列最高處的1 15 if(square[j][i] == 1) 16 { 17 s[i-local+1] = j; 18 break; 19 } 20 } 21 } 22 int b[4];memset(b,-1,sizeof(b)); 23 for(int i=0;i<4;i++)// 24 for
(int j=3;j>=0;j--){ 25 ///找block最下面的1 26 if(block[j][i] == 1){ 27 b[i] = j; 28 break; 29 } 30 } 31 int maxn = 14; 32 for(int i=0;i<4;i++) 33 { 34 if(b[i]==-1) continue; 35 else{ 36 if(s[i]-b[i]<maxn) 37 maxn = s[i]-b[i];///計算出可以下落的最長距離 38 } 39 } 40 41 for(int j=0,i=local-1;j<4;j++,i++)//block對應的列 42 for(int k=0;k<4;k++) 43 { 44 if(block[k][j] == 1) 45 square[k+maxn-1][i] = 1; 46 } 47 48 } 49 int main() 50 { 51 for(int i=0;i<15;i++) 52 for(int j=0;j<10;j++) 53 cin>>square[i][j]; 54 for(int i=0;i<10;i++) square[15][i] = 1; 55 for(int i=0;i<4;i++) 56 for(int j=0;j<4;j++) 57 cin>>block[i][j]; 58 int local; 59 cin>>local; 60 solve(local); 61 for(int i=0;i<15;i++){ 62 for(int j=0;j<10;j++){ 63 cout<<square[i][j]; 64 if(j!=9) cout<<" "; 65 } 66 cout<<endl; 67 } 68 69 return 0; 70 }

技術分享圖片

CCF 201604-2 俄羅斯方塊