#P14951. [uoi2016]小石子自动机
[uoi2016]小石子自动机
题目背景
卵石自动机「Marge-2016」运行在一个被划分成若干单元格的正方形表格上。任意时刻,每个单元格中都有若干个卵石,数量可以为 。
自动机接收两个自然数 和 作为输入:初始时,左上角单元格中有 个卵石,右上角单元格中有 个卵石,其余单元格中没有卵石。
每个单元格都附有一个函数。该函数接收当前这个单元格中的卵石数量,并返回四个数,分别表示下一次迭代时要从这个单元格搬到相邻的上、右、下、左四个单元格中的卵石数量。
每一轮迭代中,所有单元格会同时按照各自函数的返回值搬动卵石。如果某一轮迭代中没有任何卵石发生移动,则程序在这一轮后结束。自动机的输出是结束时左下角和右下角两个单元格中的卵石数量。结束时其余单元格中的卵石数量可以任意,评测时会忽略。
任务
本题共有 种子任务。输入第一行给出当前评测的子任务编号。
你需要为当前子任务构造一套单元格函数,使得对输入文件中给出的每组 ,自动机都能得到对应要求的输出。
五个子任务如下:
- 输出应为 。也就是说,左下角没有卵石,右下角有 个卵石。
- 输出应为 。也就是说,右下角有 与 差的绝对值个卵石,左下角没有卵石。
- 输出应为 。
- 输出应为 。
- 若 ,输出应为 ;若 ,输出应为 ;若 ,输出应为 。换句话说,较大数最初所在的一侧对应的底角处应留下 个卵石;若两数相等,则两个底角都不留下卵石。
Hydro 适配说明
原题是函数提交题,要求实现函数 automaton。为了在 Hydro OJ 上直接评测,本题改为普通程序输出格式。
你的程序需要读入当前测试文件,然后输出一整张「转移表」。评测器会读取这张转移表,并用它模拟自动机。
对于每个 ,你需要输出四个整数:
top right bottom left
含义分别是:当表格大小为 size,当前单元格位于第 row 行第 column 列,且其中有 pebbles 个卵石时,下一轮要搬到上、右、下、左四个相邻单元格的卵石数量。
输出顺序必须严格为:
for size = 5..10:
for row = 1..size:
for column = 1..size:
for pebbles = 1..200:
输出 top right bottom left
因此总输出行数为
行。
输入格式
第一行包含一个整数 ,表示当前子任务编号。
第二行包含一个整数 ,表示测试组数。
接下来 行,每行包含三个整数:
size A B
其中 size 是正方形表格的边长, 和 是初始时左上角与右上角的卵石数量。
输出格式
按照上文规定的顺序输出 行。
每行输出四个整数:
top right bottom left
这些数必须满足:
- 四个数均为非负整数;
- 四个数之和不能超过当前单元格中的卵石数量
pebbles; - 不能把卵石搬出表格边界;
- 对输入文件中的每一组测试数据,自动机必须在不超过 次迭代后停止;
- 停止后,左下角与右下角的卵石数量必须符合当前子任务要求。
约束条件
- ;
- ;
- 评测器在模拟过程中只会访问
pebbles从 到 的转移规则; - 自动机最多允许迭代 次。
样例
样例输入
1
1
5 3 4
样例说明
这是第 个子任务,表格大小为 ,初始时左上角有 个卵石,右上角有 个卵石。
本组数据要求最终输出为 ,即左下角有 个卵石,右下角有 个卵石。
注意:本题的程序输出是一整张转移表,共 行,因此题面中不展示完整样例输出。