#P15471. 仓储推格
仓储推格
题目描述
有一个 的仓储网格,最开始每个格子都是空的。
你可以从网格边界的某个位置向内部推入一个货箱。若推入方向上的第一个格子已经有货箱,那么原来的货箱会继续沿该方向被往后顶,直到遇到空格为止。你不能把货箱推出网格之外。
现在你需要通过恰好 次推入操作,把整个网格填满。
对于每个边界位置,定义四类操作:
- 从左边界第 行推入,记作 ;
- 从右边界第 行推入,记作 ;
- 从上边界第 列推入,记作 ;
- 从下边界第 列推入,记作 。
例如,当 时,边界位置可以表示为:
U1 U2 U3
L1 __ __ __ R1
L2 __ __ __ R2
L3 __ __ __ R3
D1 D2 D3
现在给定四个长度为 的序列 :
- 表示从上边界第 列推入货箱的次数;
- 表示从下边界第 列推入货箱的次数;
- 表示从左边界第 行推入货箱的次数;
- 表示从右边界第 行推入货箱的次数。
你需要构造一种填满整个网格的推入方案,使得每个边界位置被使用的次数恰好等于给定次数。
如果不存在合法方案,输出 -1。
输入格式
第一行一个正整数 。
第二行 个正整数,依次表示:
第三行 个正整数,依次表示:
第四行 个正整数,依次表示:
第五行 个正整数,依次表示:
输出格式
如果无解,输出 -1。
否则,输出 行,每行两个正整数。
第一个正整数必须在 内,表示本次操作从哪个边界推入:
0表示从左边界推入,即 ;1表示从右边界推入,即 ;2表示从上边界推入,即 ;3表示从下边界推入,即 。
第二个正整数必须在 内,表示本次操作所在的行或列编号。
如果有多种合法方案,输出任意一种即可。
样例 1 输入
3
0 0 1
1 1 0
3 0 1
0 1 1
样例 1 输出
0 1
0 1
0 1
0 3
3 1
1 2
2 3
1 3
3 2
样例 1 解释
该输出给出了一种合法的填满 网格的方案,并且每个边界位置的使用次数均满足输入要求。
样例 2 输入
3
3 0 0
3 0 0
3 0 0
0 0 0
样例 2 输出
-1
样例 3,4
见选手目录下:
matrix/ex_matrix.3-4.inmatrix/ex_matrix.3-4.out
分别满足子任务 3 和子任务 4 的限制。
测试点约束
对于所有数据,满足:
各子任务如下:
- 子任务 1:,无特殊性质,分值 12。
- 子任务 2:,无特殊性质,分值 12。
- 子任务 3:, 且 ,分值 11。
- 子任务 4:,无特殊性质,分值 30。
- 子任务 5:,无特殊性质,分值 35。