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 }