列表

详情


NC254199. 小红的俄罗斯方块

描述

小红正在玩一个奇怪的俄罗斯方块游戏。已知这个俄罗斯方块只有以下一种图形:


这个图形可以顺时针不旋转,旋转90度、180度、270度,分别变成以下四种情况:


当图形无法下落的时候,会停住不动。
请注意,这个俄罗斯方块没有消除的情况。也就是说会越累积越高。
假设游戏共有 8 列,高度是无限的。请你输出最终每一列的高度。

输入描述

第一行输入方块的数量 n
接下来的 n 行,每行输入两个正整数 ab,分别代表方块旋转的角度以及从哪一列下落的。方块是顺序下落的,也就是说前一个方块落到底之前,后一个方块不会开始下落。

a 一定是 0、90、180、270四个中的一个,b 代表方块的左端那一列,保证右端不会超过8。也就是说,若 a为0或180,;若a为 90或270,

输出描述

输出 8 个正整数,分别代表最终8列的高度。

示例1

输入:

3
0 1
90 2
180 4

输出:

3 3 3 4 4 0 0 0

说明:

第一个方块下落后,地图变成了这样:
第二个方块下落后,地图变成了这样:
第三个方块下落后,地图变成了这样:

最终,8列的高度为:3 3 3 4 4 0 0 0

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 524K, 提交时间: 2023-07-11 14:04:15

#include<iostream>
using namespace std;

int h[8], n;

int main(){
	
	cin >> n;
	for(int i = 1; i <= n; ++i){
		int a, b;
		cin >> a >> b;
		if(a == 0){
			int t = max(h[b]+1, h[b+1]+1);
			h[b] = t+2;
			h[b+1] = t;
		}
		else if(a == 90){
			int t = max(h[b] + 2, max(h[b+1]+1, h[b+2]+1));
			h[b] = t;
			h[b+1] = t;
			h[b+2] = t;
		} 
		else if(a == 180){
			int t = max(h[b]+1, h[b+1]+3);
			h[b] = t;
			h[b+1] = t;
		}
		else if(a == 270){
			int t = max(h[b] + 1, max(h[b+1]+1, h[b+2]+1));
			h[b] = t;
			h[b+1] = t;
			h[b+2] = t+1;
		}
	}
	for(int i = 1; i <= 8; ++i){
		cout << h[i] << " ";
	}
	return 0;
}

pypy3 解法, 执行用时: 71ms, 内存消耗: 21216K, 提交时间: 2023-07-09 19:17:00

import sys


input = sys.stdin.readline
n = int(input())
h = [0]*8

for _ in range(n):
    typ, i = map(int, input().split())
    i -= 1
    if typ == 0:
        m = max(h[i], h[i+1])
        h[i] = m+3
        h[i+1] = m+1
    elif typ == 270:
        m = max(h[i], h[i+1], h[i+2])
        h[i], h[i+1], h[i+2] = m+1, m+1, m+2
    elif typ == 90:
        m = max(h[i]+2, h[i+1]+1, h[i+2]+1)
        h[i], h[i+1], h[i+2] = m, m, m
    elif typ == 180:
        m = max(h[i]+1, h[i+1]+3)
        h[i], h[i+1] = m, m
print(*h)

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 460K, 提交时间: 2023-07-10 11:29:23

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,q[9]={0};
    cin>>n;
    while(n--)
    {
        int a,b;
        cin>>a>>b;
        if(a==0) q[b]=max(q[b],q[b+1])+3,q[b+1]=q[b]-2;
        else if(a==90) q[b]=max(q[b]+1,max(q[b+1],q[b+2]))+1,q[b+1]=q[b],q[b+2]=q[b];
        else if(a==180) q[b+1]=max(q[b],q[b+1]+2)+1,q[b]=q[b+1];
        else q[b+2]=max(q[b],max(q[b+1],q[b+2]))+2,q[b]=q[b+2]-1,q[b+1]=q[b+2]-1;
    }
    for(int i=1;i<=8;i++) cout<<q[i]<<" ";
	return 0;
}

Python3 解法, 执行用时: 41ms, 内存消耗: 4596K, 提交时间: 2023-07-09 20:13:15

l=[0]*11
for _ in range(int(input())):
    a,b=map(int,input().split())
    c,d,e=l[b:b+3]
    if a==0:
        x=max(c,d)
        l[b]=x+3
        l[b+1]=x+1
    elif a==90:
        x=max(c+1,d,e)
        l[b]=l[b+1]=l[b+2]=x+1
    elif a==180:
        x=max(c+1,d+3)
        l[b]=l[b+1]=x
    else:
        x=max(c,d,e)+1
        l[b]=l[b+1]=x
        l[b+2]=x+1
print(*l[1:9])

上一题