NC217418. 好玩的音乐游戏
描述
输入描述
第一行为两个正整数 和,代表音符的数量以及歌曲的长度。()接下来的 行,每行由一个字符串 和两个正整数、组成,分别代表音符的类型、音符出现的时间以及音符所在的音轨位置。(,且 一定是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"; } }