列表

详情


NC15807. twh233打方块

描述

twh233最近迷上了打俄罗斯方块
俄罗斯方块游戏界面是由一个15×10的像素格构成, 有7种不同类型的方块(如下图)

游戏开始前, 所有的像素格都是空着的
游戏开始时, 会随机出现上述7种方块之一, 然后他们缓慢下落, 在方块下落的过程中, twh233可以对正在下落的方块进行如下操作
1.顺时针旋转90° (例如: 可以变换为, 继续变换得到
2.将方块水平移动一格(不能将方块任何部分移动出游戏边界)(例如: 变换为
为了简化问题, twh233只会在灰色区域对下落的方块进行上述操作 (可以进行无限次操作), 随后让方块自由下落 (不再进行任何操作)
当正在下落的方块被其他方块或最下方的平面所阻挡无法继续下落, 这个方块将停止在这个位置
例如: 正在下落的橙色方块将下落至
当某一行所有像素格都有方块, 那么twh233将获得1分, 同时这一行将会被消除
例如: 倒数第一行和倒数第三行将被消除, twh233得到2分, 此时将变为:

twh233玩了一会游戏, 感觉到了无聊
他想知道: 对于当前的局面, 如果他能指定某个方块下落, 通过旋转和平移操作后, 他本次能得到的最高分是多少?
你能写个程序帮帮他吗?

输入描述

第1行至第15行每一行包含10个字符, 代表游戏当前的局面
('#'代表该位置有方块, '*'代表该位置为空)

输出描述

输出一个非负整数, 代表twh233指定某个方块下落, 通过旋转和平移操作后, 他本次能得到的最高分

示例1

输入:

**********
**********
**********
**********
**********
**********
**********
**********
**********
**********
**********
#########*
#########*
#########*
#########*

输出:

4

说明:

此时游戏局面为:
twh233指定下落, 将得到如下局面: , 所以他最多能得到4分

示例2

输入:

**********
**********
**********
**********
**********
**********
**********
**********
**#***#***
*###*###**
#########*
*#######**
**#####***
***###****
****#*****

输出:

1

说明:

此时游戏局面为:
twh233指定下落, 将得到如下局面: , 所以他最多能得到1分

示例3

输入:

**********
**********
**********
**********
**********
###***##**
#****#**#*
###**#**#*
#****#**#*
#*****##**
#****###**
#****#**#*
#****#**#*
#****#**#*
###**###**

输出:

0

说明:

此时游戏局面为:  , 无论接下来是哪一个方块下落, twh233都不能得分

示例4

输入:

**********
**********
**********
**********
**********
#########*
**#**#**#*
######**#*
#**#****#*
######**#*
#*#######*
#*#**##*#*
#######*#*
**##**#*#*
**#######*

输出:

1

说明:

此时游戏局面为:

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 488K, 提交时间: 2019-01-19 19:42:06

#include<bits/stdc++.h>
using namespace std;

struct block
{
    bool a[5][5];
    int l,r;
    block() {memset(a,0,sizeof(a));}
};

vector<block>G;

void make(int b,int c,int d,int e,int f,int g,int h,int i,int l,int r)
{
    block x;
    x.a[b][c]=1,x.a[d][e]=1;
    x.a[f][g]=1,x.a[h][i]=1;
    x.l=l,x.r=r;G.push_back(x);
}

void init()
{
    make(1,1,1,2,1,3,1,4,1,4);
    make(1,1,2,1,3,1,4,1,1,1);

    make(1,1,2,1,2,2,2,3,1,3);
    make(1,1,1,2,2,1,3,1,1,2);
    make(1,1,1,2,1,3,2,3,1,3);
    make(1,2,2,2,3,2,3,1,1,2);

    make(2,1,2,2,2,3,1,3,1,3);
    make(1,1,2,1,3,1,3,2,1,2);
    make(1,1,1,2,1,3,2,1,1,3);
    make(1,1,1,2,2,2,3,2,1,2);

    make(1,1,1,2,2,1,2,2,1,2);

    make(1,2,1,3,2,1,2,2,1,3);
    make(1,1,2,1,2,2,3,2,1,2);

    make(1,1,1,2,2,2,2,3,1,3);
    make(1,2,2,1,2,2,3,1,1,2);

    make(1,2,2,2,2,1,2,3,1,3);
    make(1,2,2,1,2,2,3,2,1,2);
    make(1,1,2,1,3,1,2,2,1,2);
    make(1,1,1,2,1,3,2,2,1,3);
}

char a[20][15];

int down(int i,int j)
{
    int l=j,r=j+G[i].r-1;
    for(int k=1;;k++)
        for(int x1=1,x2=k;x1<=4; x1++,x2++)
            for(int y1=1,y2=l;y1<=G[i].r && y2<=r;y1++,y2++)
                if(G[i].a[x1][y1] && a[x2][y2]=='#')
                    return k-1;
}

void add(int i,int j,int k,bool op)
{
    int l=j,r=j+G[i].r-1;
    for(int x1=1,x2=k;x1<=4; x1++,x2++)
        for(int y1=1,y2=l;y1<=G[i].r && y2<=r;y1++,y2++)
            if(G[i].a[x1][y1])
                a[x2][y2]=op?'#':'*';
}

int cal()
{
    int res=0;
    for(int i=1;i<=15;i++)
    {
        bool flag=true;
        for(int j=1;j<=10;j++)
            if(a[i][j]=='*')
                flag=false;
        if(flag)res++;
    }
    return res;
}

int main()
{
    init();
    for(int i=1;i<=15;i++)scanf("%s",a[i]+1);
    for(int i=1;i<=10;i++)a[16][i]='#';
    int ans=0;
    for(int i=0;i<G.size();i++)
        for(int j=1;j+G[i].r<=11;j++)
        {
            int k=down(i,j);
            add(i,j,k,true);
            ans=max(ans,cal());
            add(i,j,k,false);
        }
    return !printf("%d\n",ans);
}

C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 384K, 提交时间: 2018-05-06 00:52:17

#include<bits/stdc++.h>
using namespace std;

struct block
{
    bool a[5][5];
    int l,r;
    block() {memset(a,0,sizeof(a));}
};

vector<block>G;

void make(int b,int c,int d,int e,int f,int g,int h,int i,int l,int r)
{
    block x;
    x.a[b][c]=1,x.a[d][e]=1;
    x.a[f][g]=1,x.a[h][i]=1;
    x.l=l,x.r=r;G.push_back(x);
}

void init()
{
    make(1,1,1,2,1,3,1,4,1,4);
    make(1,1,2,1,3,1,4,1,1,1);

    make(1,1,2,1,2,2,2,3,1,3);
    make(1,1,1,2,2,1,3,1,1,2);
    make(1,1,1,2,1,3,2,3,1,3);
    make(1,2,2,2,3,2,3,1,1,2);

    make(2,1,2,2,2,3,1,3,1,3);
    make(1,1,2,1,3,1,3,2,1,2);
    make(1,1,1,2,1,3,2,1,1,3);
    make(1,1,1,2,2,2,3,2,1,2);

    make(1,1,1,2,2,1,2,2,1,2);

    make(1,2,1,3,2,1,2,2,1,3);
    make(1,1,2,1,2,2,3,2,1,2);

    make(1,1,1,2,2,2,2,3,1,3);
    make(1,2,2,1,2,2,3,1,1,2);

    make(1,2,2,2,2,1,2,3,1,3);
    make(1,2,2,1,2,2,3,2,1,2);
    make(1,1,2,1,3,1,2,2,1,2);
    make(1,1,1,2,1,3,2,2,1,3);
}

char a[20][15];

int down(int i,int j)
{
    int l=j,r=j+G[i].r-1;
    for(int k=1;;k++)
        for(int x1=1,x2=k;x1<=4; x1++,x2++)
            for(int y1=1,y2=l;y1<=G[i].r && y2<=r;y1++,y2++)
                if(G[i].a[x1][y1] && a[x2][y2]=='#')
                    return k-1;
}

void add(int i,int j,int k,bool op)
{
    int l=j,r=j+G[i].r-1;
    for(int x1=1,x2=k;x1<=4; x1++,x2++)
        for(int y1=1,y2=l;y1<=G[i].r && y2<=r;y1++,y2++)
            if(G[i].a[x1][y1])
                a[x2][y2]=op?'#':'*';
}

int cal()
{
    int res=0;
    for(int i=1;i<=15;i++)
    {
        bool flag=true;
        for(int j=1;j<=10;j++)
            if(a[i][j]=='*')
                flag=false;
        if(flag)res++;
    }
    return res;
}

int main()
{
    init();
    for(int i=1;i<=15;i++)scanf("%s",a[i]+1);
    for(int i=1;i<=10;i++)a[16][i]='#';
    int ans=0;
    for(int i=0;i<G.size();i++)
        for(int j=1;j+G[i].r<=11;j++)
        {
            int k=down(i,j);
            add(i,j,k,true);
            ans=max(ans,cal());
            add(i,j,k,false);
        }
    return !printf("%d\n",ans);
}

上一题