CCF 201604-2 俄罗斯方块

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 }

Python(80)暂记:

 1 import sys
 2 arr = [[0 for i in range(10)] for j in range(18)]
 3 for row in range(15):
 4     num = list(map(int, input().split()))
 5     for col in range(10):
 6         if num[col] == 1:
 7             arr[row][col] = 1
 8 
 9 square = [[0 for i in range(4)] for j in range(4)]
10 
11 for row in range(4):
12     num = list(map(int, input().split()))
13     for col in range(4):
14         if num[col] == 1:
15             square[row][col] = 1
16 
17 loc = int(input())
18 
19 
20 # 找到板块图案的最下面一行(有1的最下面的一行)
21 squareLow = 0
22 for i in range(4):
23     for j in range(4):
24         if square[3-i][j] == 1:
25             squareLow = i # 第一次修改就应该退出
26             break
27     if squareLow != 0: break
28         
29 temp = [-1, -2, -3, -4] # 分别表示板块从下到上应该在方块图中填充的行数
30 # 开始下落, 只进行探测,不改变原方格图
31 flag = True
32 while temp[squareLow] < 14:
33     for row in range(squareLow, 4):
34         for col in range(loc-1, loc+3):
35             # 不能继续下落一行就退出
36             if temp[row]+1>=0:
37                 if arr[temp[row]+1][col] == 1 and square[3-row][col-loc+1] == 1:
38                     flag = False
39                     break
40     if flag == False:
41         break
42     # 可以继续下落一行,将temp每一行的位置进行修改
43     for i in range(4): temp[i] += 1
44 
45 # 确定了板块每一行的位置后,将板块填充进方块图就好
46 for row in range(squareLow, 4):
47     for col in range(loc-1, loc+3):
48         if temp[row]>=0 and temp[row] < 15:
49             if square[3-row][col-loc+1] == 1:
50                 arr[temp[row]][col] = square[3-row][col-loc+1]
51 
52 # 打印方块图
53 for row in range(15):
54     for col in range(10):
55         print(arr[row][col], end=" ")
56     print()
原文地址:https://www.cnblogs.com/yxh-amysear/p/8479033.html