编程题:BFS/DFS
两组穴居人陷入了一场土地纠纷,并决定以旧式的方式解决,即互相扔棍子。这场战斗是在一个洞穴中组织的,洞穴的高度足以使天花板不受影响,但地面上的矿藏妨碍了木棍的飞行。
洞穴可分为R行和C列,因此整个洞穴由R×C细胞组成。洞穴中的每个细胞要么是空的,要么含有一大块矿物质。如果两块矿物在四个主要方向(上、下、左、右)中的一个方向上相邻,则它们是同一簇的一部分。
一组洞穴人在洞穴的左侧,另一组在右侧。两组轮流向另一组投掷棍子;首先,一组人选择棍子将飞到的高度,然后(必要时爬到彼此的肩膀上)他们将棍子扔出去,棍子在选定的高度水平地穿过洞穴。
如果棍子在路上碰到一块矿物,它就会破坏这块矿物,方格变空,棍子就会停止它的飞行。
当一个矿物被破坏时,一个矿物可能会解体成碎片。如果一个新的碎片漂浮在空中,那么它就会因为重力而坠落。落下时,簇不会改变形状,即簇中的所有块都落在一起。一旦下落的碎片中的某个碎片落在另一个碎片或地面上,碎片就会停止下落。当然,如果一个碎片落在另一个碎片上,它们就会合并成为一个矿物。
你的程序将给出洞穴中矿物的布局和投掷棍棒的高度。交换木棍后,确定矿物的布局。
### 输入格式:
第一行包含两个整数R和C(1≤R、C≤100),表示洞穴的尺寸。
下面的每一行都将包含C字符。角色“.”代表一个空单元格,而字母“x”代表一大块矿物。
下一行包含一个整数N(1≤N≤100),表示投掷的棍子数。
最后一行包含由空格分隔的N个整数,表示投掷棍棒的高度。所有高度将在1和R(含)之间,高度1为矩阵底部,高度R为顶部。第一根棍子从左到右,第二根从右到左,依此类推。
最初没有碎片会漂浮在空中。此外,输入数据将确保在任何时候都不会有两个或多个碎片同时落下,这样就不会出现不明确的情况。
### 输出格式:
输出应由R行组成,每行包含C字符,即洞穴的最终布局,格式与输入相同。
### 输入样例1:
in
5 6
......
..xx..
..x...
..xx..
.xxxx.
1
3
### 输出样例1:
out
......
......
..xx..
..xx..
.xxxx.
### 输入样例2:
in
8 8
........
........
...x.xx.
...xxx..
..xxx...
..x.xxx.
..x...x.
.xxx..x.
5
6 6 4 3 1
### 输出样例2:
out
........
........
........
........
.....x..
..xxxx..
..xxx.x.
..xxxxx.
### 输入样例3:
in
7 6
......
......
xx....
.xx...
..xx..
...xx.
....x.
2
6 4
### 输出样例3:
out
......
......
......
......
..xx..
xx.xx.
.x..x.
在第二个示例中,第一根棍子销毁高度为6的第四列中的块,第二根棍子销毁同一行第七列中的块。
第三根棍子摧毁了第三列中高度为4的区块,之后开始的碎片一分为二,但两个新碎片仍然躺在地上。
第四根棍子摧毁第七列中高度为3的区块,将右侧的集群一分为二。最大的碎片会漂浮在空中,落下两个空格。
最后,第五根棍子在第二列的高度1处销毁一块。
答案:若无答案欢迎评论
洞穴可分为R行和C列,因此整个洞穴由R×C细胞组成。洞穴中的每个细胞要么是空的,要么含有一大块矿物质。如果两块矿物在四个主要方向(上、下、左、右)中的一个方向上相邻,则它们是同一簇的一部分。
一组洞穴人在洞穴的左侧,另一组在右侧。两组轮流向另一组投掷棍子;首先,一组人选择棍子将飞到的高度,然后(必要时爬到彼此的肩膀上)他们将棍子扔出去,棍子在选定的高度水平地穿过洞穴。
如果棍子在路上碰到一块矿物,它就会破坏这块矿物,方格变空,棍子就会停止它的飞行。
当一个矿物被破坏时,一个矿物可能会解体成碎片。如果一个新的碎片漂浮在空中,那么它就会因为重力而坠落。落下时,簇不会改变形状,即簇中的所有块都落在一起。一旦下落的碎片中的某个碎片落在另一个碎片或地面上,碎片就会停止下落。当然,如果一个碎片落在另一个碎片上,它们就会合并成为一个矿物。
你的程序将给出洞穴中矿物的布局和投掷棍棒的高度。交换木棍后,确定矿物的布局。
### 输入格式:
第一行包含两个整数R和C(1≤R、C≤100),表示洞穴的尺寸。
下面的每一行都将包含C字符。角色“.”代表一个空单元格,而字母“x”代表一大块矿物。
下一行包含一个整数N(1≤N≤100),表示投掷的棍子数。
最后一行包含由空格分隔的N个整数,表示投掷棍棒的高度。所有高度将在1和R(含)之间,高度1为矩阵底部,高度R为顶部。第一根棍子从左到右,第二根从右到左,依此类推。
最初没有碎片会漂浮在空中。此外,输入数据将确保在任何时候都不会有两个或多个碎片同时落下,这样就不会出现不明确的情况。
### 输出格式:
输出应由R行组成,每行包含C字符,即洞穴的最终布局,格式与输入相同。
### 输入样例1:
in
5 6
......
..xx..
..x...
..xx..
.xxxx.
1
3
### 输出样例1:
out
......
......
..xx..
..xx..
.xxxx.
### 输入样例2:
in
8 8
........
........
...x.xx.
...xxx..
..xxx...
..x.xxx.
..x...x.
.xxx..x.
5
6 6 4 3 1
### 输出样例2:
out
........
........
........
........
.....x..
..xxxx..
..xxx.x.
..xxxxx.
### 输入样例3:
in
7 6
......
......
xx....
.xx...
..xx..
...xx.
....x.
2
6 4
### 输出样例3:
out
......
......
......
......
..xx..
xx.xx.
.x..x.
在第二个示例中,第一根棍子销毁高度为6的第四列中的块,第二根棍子销毁同一行第七列中的块。
第三根棍子摧毁了第三列中高度为4的区块,之后开始的碎片一分为二,但两个新碎片仍然躺在地上。
第四根棍子摧毁第七列中高度为3的区块,将右侧的集群一分为二。最大的碎片会漂浮在空中,落下两个空格。
最后,第五根棍子在第二列的高度1处销毁一块。
答案:若无答案欢迎评论