• 俄罗斯方块


    Description

      相信大家都玩过“俄罗斯方块”游戏吧,“俄罗斯方块”是一个有趣的电脑小游戏,现有一个有C列、行不受限定游戏平台,每一次下落的方块是下列的7个图形的一种:   
    这里写图片描述

      在下落的过程中,游戏者可以作90、 180或270 度旋转,还可以左右移动,对于每一次方块落地,我们要求方块的每一部分都必须与地面(最底面或己落下的方块上表面)接触,例如,有一个宽度为6列的平台,每一列的初始高度(已经占用的方格数)分别为2, 1, 1, 1, 0 和 1。编号为5的方块下落,有且仅有5种不同的落地方法:  
    这里写图片描述

        现给出每一列的初始高度和下落方块的形状,请你编写一个程序,求出落地的方法总数,也就是落地后,地表面形成的不同的形状总数。

    Input

      第一行为二个整数C和P,1 ≤ C ≤ 100, 1 ≤ P ≤ 7,表示列数和下落方块的编号   第二行共有用一个空隔隔开的C个整数,每一个数字在 0 到 100,之间(包含0和100),表示每一列的初始高度

    Output

      输出为一个整数,表示落地的方法总数

    Sample Input

    Input1

    6 5

    2 1 1 1 0 1

    Input2

    5 1

    0 0 0 0 0

    Input3

    9 4

    4 3 5 4 6 5 7 6 6

    Sample Output

    Output1

    5

    Output2

    7

    Output3

    1

    分析
    这是一道水题
    暴力即可

    注意:
    当图形(如图二),旋转后的形状与原图一样,则落地的方法只视为一种。

    程序:

    var
    ans,c,p,i:longint;
    a:array[0..200]of longint;
    procedure work1;
    var
    j,bz,i:longint;
    begin
        ans:=c;
        for i:=1 to c-4+1 do
        if (a[i]=a[i+1])and(a[i+1]=a[i+2])and(a[i+2]=a[i+3]) then inc(ans);
    end;
    
    procedure work2;
    var
    i:longint;
    begin
        for i:=1 to c-1 do
        if (a[i]=a[i+1]) then inc(ans);
    end;
    
    
    procedure work3;
    var
    i:longint;
    begin
        for i:=1 to c-3+1 do
        if (a[i]=a[i+1])and(a[i+1]+1=a[i+2]) then inc(ans);
        for i:=1 to c-2+1 do
        if (a[i]-1=a[i+1]) then inc(ans);
    end;
    
    procedure work4;
    var
    i:longint;
    begin
        for i:=1 to c-3+1 do
        if (a[i]-1=a[i+1])and(a[i+1]=a[i+2]) then inc(ans);
        for i:=1 to c-2+1 do
        if (a[i]+1=a[i+1]) then inc(ans);
    end;
    
    procedure work5;
    var
    i:longint;
    begin
        for i:=1 to c-3+1 do
        if (a[i]=a[i+1])and(a[i]=a[i+2]) then inc(ans);
        for i:=1 to c-2+1 do
        if (a[i]-1=a[i+1]) then inc(ans);
        for i:=1 to c-3+1 do
        if (a[i]-1=a[i+1])and(a[i]=a[i+2]) then inc(ans);
        for i:=1 to c-2+1 do
        if (a[i]+1=a[i+1]) then inc(ans);
    end;
    
    procedure work6;
    var
    i:longint;
    begin
        for i:=1 to c-3+1 do
        if (a[i]=a[i+1])and(a[i]=a[i+2]) then inc(ans);
        for i:=1 to c-2+1 do
        if (a[i]-2=a[i+1]) then inc(ans);
        for i:=1 to c-3+1 do
        if (a[i]+1=a[i+1])and(a[i+1]=a[i+2]) then inc(ans);
        for i:=1 to c-2+1 do
        if (a[i]=a[i+1]) then inc(ans);
    end;
    
    procedure work7;
    var
    i:longint;
    begin
        for i:=1 to c-3+1 do
        if (a[i]=a[i+1])and(a[i]=a[i+2]) then inc(ans);
        for i:=1 to c-2+1 do
        if (a[i]=a[i+1]) then inc(ans);
        for i:=1 to c-3+1 do
        if (a[i]=a[i+1])and(a[i]-1=a[i+2]) then inc(ans);
        for i:=1 to c-2+1 do
        if (a[i]+2=a[i+1]) then inc(ans);
    end;
    
    begin
        readln(c,p);
        for i:=1 to c do
        read(a[i]);
        ans:=0;
        if p=1 then work1 else
        if p=2 then work2 else
        if p=3 then work3 else
        if p=4 then work4 else
        if p=5 then work5 else
        if p=6 then work6 else
        if p=7 then work7;
        write(ans);
    end.
    
    
  • 相关阅读:
    第89题:格雷编码
    第88题:合并两个有序数组
    第86题:分隔链表
    第83题:删除排序链表中的重复元素
    第82题:删除排序链表中的重复元素II
    第81题:搜索旋转排序数组II
    redis笔记---不定时更新
    关于银行股
    开博客
    group by
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9500000.html
Copyright © 2020-2023  润新知