zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    2.WSDL 文档
    SQL SERVER取分组数据第一条:查出每个班级的成绩第一名
    生成随机字符串
    js返回上一页并刷新的几种方法
    SQL 单表查询多个计算的值
    SQL 从字符串中提取数字
    SQL 视图和表
    WebSrevice (2)
    WebSrevice (1)
    CSS中如何选择ul下li的奇数、偶数行
  • 原文地址:https://www.cnblogs.com/yxh-amysear/p/8479033.html
Copyright © 2011-2022 走看看