#P15588. [2025年山东第一轮集训] 推箱子

    ID: 14800 传统题 1000ms 512MiB 尝试: 1 已通过: 1 难度: 7 上传者: 标签>图论网络流算法基础构造模拟数学CF2300

[2025年山东第一轮集训] 推箱子

题目描述

小 B 正在玩一个推箱子游戏。

有一个 n×nn\times n 的网格图,在网格图外面有一些箱子。小 B 想要通过推箱子来在网格图内部得到给定的图案。

箱子在网格图四个方向最外侧格子的外面。每一次你可以选定一个方向的一行或一列推动箱子。你必须保证选择的位置在这个方向还有箱子,同时不能将网格图内的箱子推出网格图。

同时,小 B 会将所有的箱子推进网格图内,即图案中的箱子数等于总箱子数。

下面给你每个外侧格子对应方向外的箱子数量和最终的图案,你需要判断能否找到一个合法的方案。如果可以,你需要输出方案。

输入格式

第一行一个正整数 nn,表示网格图大小。

接下来 nn 行,每行一个长度为 nn 的字符串,表示最后的图案。字符 # 代表有箱子,字符 . 代表没箱子。

接下来四行,每行 nn 个数,分别表示:

  • U1UnU_1\sim U_n:第一行格子上面第 1n1\sim n 列的箱子个数;
  • D1DnD_1\sim D_n:最后一行格子下面第 1n1\sim n 列的箱子个数;
  • L1LnL_1\sim L_n:第一列格子左边第 1n1\sim n 行的箱子个数;
  • R1RnR_1\sim R_n:最后一列格子右边第 1n1\sim n 行的箱子个数。

输出格式

第一行输出 Yes 或者 No,表示有没有解。

如果有解,接下来输出若干行表示操作。每一行输出形如 UiDiLiRi,表示从上、下、左、右方向的第 ii 行或列推动了一步箱子。

样例 1 输入

3
###
#.#
###
0 0 1
1 1 0
3 0 1
0 0 1

样例 1 输出

Yes
L1
L1
L1
D2
U3
L3
D1
R3

测试点约束

对于所有数据:

1n5001\le n\le 500 0Ui,Di,Li,Ri0\le U_i,D_i,L_i,R_i

并且:

i=1n(Ui+Di+Li+Ri)=C#\sum_{i=1}^{n}(U_i+D_i+L_i+R_i)=C_{\#}

其中 C#C_{\#} 表示最终图案中字符 # 的个数。

子任务 分值 约束
1 10 n3n\le 3
2 15 Di=Ri=0D_i=R_i=0
3 Di=0D_i=0
4 n40n\le 40
5 i=1n(Ui+Di+Li+Ri)=n×n\sum_{i=1}^{n}(U_i+D_i+L_i+R_i)=n\times n
6 30 无特殊限制

附件说明

附件里提供了 chk.exe 来测试你的答案。你可以通过在命令行输入:

./checker <input-file> <output-file> <answer-file>

来测试你的答案,其中 <answer-file> 没有影响。需要注意,这个程序只会测试你的解是否合法,不会告诉你有没有解。

@下发检测文件