P6370 [COCI 2006/2007 #6] KAMEN

题目描述

在一个 $r\times c$ 的方阵里,有些点是 `.`,表示为空;有些点是 `X`,表示这里是一堵墙。 我们可以认为这个方阵在竖直方向放置。 有一个人在这 $c$ 列的第一行会抛下 $n$ 块石头,用 `O` 来表示。如果这一个石头由于重力作用会向下滚动。具体来说,就是会从第一行向最后一行滚动,规则如下: - 如果下一个格子是空格,那么向下运动一格。 - 如果下一个格子是墙或者已经到了第 $r$ 行,则停止滚动并停在原处。 - 如果下一个格子是一块停止的石头,则如果在左侧和左下方为空格时首选滚动到左侧的那一行,否则如果右侧和右下方为空格,则滚动到右侧的那一行。如果两侧都不为空,则石头静止不在移动。 只有前一块石头永久静止后,下一块石头才会被抛下。 请你输出最终方阵的状态。

输入格式

输入第一行为两个整数 $r,c$。 接下来的 $r$ 行,每行 $c$ 个字符,每个字符可能为 `.` 或 `X`。 下一行为一个整数 $n$,表示石头的数量。 接下来的 $n$ 行,每行一个整数 $1\le x\le c$,表示这个石头位于第 $x$ 列被抛下,按照输入顺序依次抛下。

输出格式

输出一个 $r\times c$ 的方阵,包含 `.` `X` `O`,为最终石头都抛完后的状态。

说明/提示

#### 样例 1 解释 $4$ 块石头依次在第一列被抛下。第一块石头被唯一一堵墙堵住。这样剩下的石头都可以向右滚动一列。第二块石头毫无障碍地下落,第三四块分别落在了它的左边和右边。 #### 数据规模与约定 - 对于 $60\%$ 的数据,保证 $r\le 30$。 - 对于 $100\%$ 的数据,保证 $1\le r\le 3\times 10^4$,$1\le c\le 30$,$1\le n\le 10^5$。 #### 说明 **题目译自 [COCI2006-2007](https://hsin.hr/coci/archive/2006_2007/) [CONTEST #6](https://hsin.hr/coci/archive/2006_2007/contest6_tasks.pdf) *T4 KAMEN***。