P4441 [COCI 2017/2018 #3] Retro

题目描述

小 Mirko 在圣诞节得到了一个视频游戏机。它不是 Playstation 4 或 Xbox one,而是 Atari 2600,并且附带了一个免费游戏。游戏的主角站在屏幕的底部,屏幕上其他地方有各种物体向底部掉落。 更确切地说,屏幕可以表示为一个由 R 行 S 列像素组成的网格。主角占据最底行的一个像素,并用 'M' 标记。其余像素用以下字符之一标记:'.'(空格)、'*'(炸弹)、'('(左括号)或 ')'(右括号)。 主角可以在一次移动中向左或向右移动一个像素,但不需要移动,而其他物体同时向下移动一个像素(可能移出屏幕)。当主角与一个括号处于同一位置时,我们说他拾取了该括号并将其添加到他已获得的括号数组的末尾。主角的目标是获得尽可能长的**有效**括号表达式。 有效的括号表达式通过以下方式递归定义: - "()" 是一个有效的表达式。 - 如果 **a** 是一个有效的表达式,那么 "(**a**)" 也是一个有效的表达式。 - 如果 **a** 和 **b** 是有效的表达式,那么 "**ab**" 也是一个有效的表达式。 当主角与炸弹处于同一位置时,或者当所有物体都掉出屏幕时,游戏结束。

输入格式

输入的第一行包含正整数 R 和 S(1 ≤ R, S ≤ 300),表示屏幕的尺寸。 接下来的 R 行中的每一行包含 S 个字符 'M'、'.'、'*'、'(' 或 ')',表示屏幕的初始状态。 测试数据将保证总是存在至少一个可以获得的有效括号表达式。

输出格式

在第一行,你必须输出 Mirko 可以获得的最长有效括号表达式的长度。 在第二行,输出该表达式。如果存在多个最长的有效表达式,输出**字典序最小**的那个。

说明/提示

在价值 25% 总分的测试用例中,将满足 1 ≤ R ≤ 15。 在价值 50% 总分的测试用例中,将满足 1 ≤ R ≤ 100。 如果你输出了正确的长度,但表达式错误,你将获得该测试用例 40% 的分数。无论如何,为了得分,你的输出必须包含两行非空内容。 **第一个测试用例的说明**:主角的移动是:左,左,右,右。 **第二个测试用例的说明**:主角的移动是:保持不动,保持不动,保持不动,右,左。 **第三个测试用例的说明**:主角的移动是:保持不动,保持不动,右。 题面翻译由 ChatGPT-4o 提供。