列表

详情


NC217418. 好玩的音乐游戏

描述

小红最近迷上了一个好玩的音乐游戏——邦多利。她玩了一段时间之后,决定自己制作音游的谱面。于是,她打开了一个谱面制作器:

已知音符一共有2种类型:
1.点击(tap),用大写字母O表示。
2.滑动(也称粉键,flick),用大写字母X表示。
在同一时间如果有两个音符同时出现,需要用连接线把它们连接起来(除非他们是相邻的两个音符就不用连)。
小红输入了一些时间和该时间应出现的音符,请你将谱面打印出来。
ps:谱面一共有7个轨道可以用来放置音符!

输入描述

第一行为两个正整数 ,代表音符的数量以及歌曲的长度。(
接下来的 行,每行由一个字符串 s_i和两个正整数t_ih_i组成,分别代表音符的类型、音符出现的时间以及音符所在的音轨位置。(,且 s_i 一定是tap或flick中的一个单词)
保证输入合法,即不会在同一时间的同一个音轨出现两个以上音符,也不会同一时间出现超过2个音符。

输出描述

一共行字符串,用来表示谱面。
谱面最底部有一行固定的字符串 +-------+ 表示谱面开始,这一行不计入歌曲总时间。
谱面开始以后,每一行表示一个时刻,一行中有 7 个字符(只可能是空格、大写字母O、大写字母X、短横线中的一种)被包含在两个竖线(|)之间表示当前时刻 7 个音轨的状态。
如果在同一时刻,相邻的两个音轨出现音符,则不需要再绘制短横线进行连接。

示例1

输入:

3 10
tap 2 1
tap 5 6
flick 2 4

输出:

|       |
|       |
|       |
|       |
|       |
|     O |
|       |
|       |
|O--X   |
|       |
+-------+

说明:

请注意,由于这是一款下落式音游,时间自铺面底部到铺面顶部递增。

示例2

输入:

2 2
tap 2 1
tap 2 2

输出:

|OO     |
|       |
+-------+

说明:

如果两个相邻的音轨同时出现音符,则不需要连线。

原站题解

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

Python3 解法, 执行用时: 58ms, 内存消耗: 3472K, 提交时间: 2021-05-19 17:07:54

n, m = map(int, input().split())
res = [list('|-------|') for i in range(m)]

ti = set()
tap = 'tap'
flick = 'flick'
for i in range(n):
    a, b, c = map(eval, input().split()) # type  time  posi
    ti.add(b-1)
    if a == tap: res[b-1][c] = 'O'
    if a == flick: res[b-1][c] = 'X'

i = len(res)-1
while i >= 0:
    if i in ti:
        t = '|'
        t1 = 1
        while res[i][t1] == '-':
            t1 += 1
        t += ' '*(t1-1)
        t2 = 7
        while res[i][t2] == '-':
            t2 -= 1
        t += ''.join(res[i][t1:t2+1])
        t += ' '*(7-t2) + '|'
        print(t)
    else:
        print(''.join(res[i]).replace('-', ' '))
    i -= 1
print('+-------+')

C++(g++ 7.5.0) 解法, 执行用时: 9ms, 内存消耗: 472K, 提交时间: 2023-05-13 10:46:22

#include<bits/stdc++.h>
using namespace std;
char s[2020][9];
int n,m;
void dfs(int c,int d){
	for(int i=d+1;i<=8;i++){
		if(s[c][i]=='O'||s[c][i]=='X'){
			for(int j=d+1;j<i;j++){
				s[c][j]='-';
			}
			return ;
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		s[i][0]='|';
		s[i][8]='|';
		for(int j=1;j<=7;j++){
			s[i][j]=' ';
		}
	}
	while(n--){
		string s1;
		cin>>s1;
		int a,b;
		cin>>a>>b;
		if(s1=="tap") {
			s[a][b]='O';
		} 
		else s[a][b]='X';
	}
	for(int i=m;i>=1;i--){
	    cout<<s[i][0];
	    for(int j=1;j<=7;j++){
	    	if(s[i][j]=='O'||s[i][j]=='X') dfs(i,j);
	    	cout<<s[i][j];
		}
		cout<<s[i][8]<<endl;
	}
	cout<<"+-------+";
	return 0;
}

C++ 解法, 执行用时: 4ms, 内存消耗: 472K, 提交时间: 2021-09-11 18:25:54

#include<bits/stdc++.h>
using namespace std;
string ans[2005] = {"+-------+"}, s;
int n, m, t, h;
map<string, char>mp = {{"tap", 'O'}, {"flick", 'X'}};
signed main()
{
	cin >> n >> m;
	for(int i = 1; i <= m; i++)
		ans[i] = "|       |";
	while(n--)
	{
		cin >> s >> t >> h;
		ans[t][h] = mp[s];
	}
	for(int i = m, p, q; ~i; i--)
	{
		for(p = 0; p < 8 && !isalpha(ans[i][p]); p++);
		for(q = 7; ~q && !isalpha(ans[i][q]); q--);
		for(int j = p+1; j < q; j++)
			ans[i][j] = '-';
		cout << ans[i] << "\n";
	}
}

上一题