#HK5484. 「UOI 2016 Stage 4 Day1」卵石自动机

「UOI 2016 Stage 4 Day1」卵石自动机

注意事项

在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

  • C++(标准为 C++ 17 及以上)

请在提交源代码前添加 #include "automaton.h"

题目描述

题目译自 Ukrainian Olympiads in Informatics 2016 Stage 4 Day2 T4. Камінчиковий автомат

「Marge-2016」卵石自动机在一个划分为单元格的方形表格上工作,在任意时刻,每个单元格中都放置着一定数量(可能为零)的卵石。自动机接收两个自然数 AABB 作为输入,分别表示初始时刻位于表格左上角和右上角单元格中的卵石数量。在初始时刻,其余单元格中没有卵石。每个单元格都附有一个函数:该函数接收当前单元格中的卵石数量作为输入,并返回在下一次迭代中需要从该单元格移动到其相邻的上、右、下、左单元格的卵石数量。因此,在每次迭代中,卵石自动机只是根据附着在单元格上的函数所返回的指令,将相应数量的卵石从所有单元格移动到相邻单元格。所有的移动都是同时进行的。如果在某次迭代中,没有任何一个单元格向任何一个相邻单元格移动任何卵石,则程序的执行在该次迭代后终止。在输出端,自动机返回两个数字:左下角和右下角单元格中的卵石数量。程序结束时所有其他单元格中包含的卵石数量可以是任意的,并且会被忽略。

实现细节

您需要提交一个文件,其中包含 automaton 函数/过程的实现,以及该函数正确工作所需的其他代码(如果需要),但不应包含程序的主体(即 C++ 中的 main 函数或 Pascal 中的 begin/end. 块)。在评测时,您的文件将由评委编写的特殊程序主体进行补充。该主体将以适当的方式调用您编写的函数,并检查其实现的算法的正确性。您实现的函数应具有以下形式:

automaton(subproblem, size, row, column, pebbles, top, right, bottom, left)
  1. subproblem — 子任务编号(见上文)。在同一程序运行期间,子任务编号不会改变。
  2. size — 方形表格的大小(一行/一列中的单元格数量)。在同一程序运行期间,大小不会改变。
  3. row — 单元格所在的行;从上到下编号为 1size1 — 最顶行,size — 最底行。
  4. column — 单元格所在的列;从左到右编号为 1size1 — 最左列,size — 最右列。
  5. pebbles — 单元格中的卵石数量,一个正整数(如果数量为零,则无法进行任何移动,也不会调用该函数)。您可以在函数内部更改此变量的值,但这种更改不会产生任何效果:移动后单元格中的卵石数量将自动等于初始卵石数量与移动到相邻单元格的卵石数量之差(见下文)。
  6. top — 此参数的初始值(由程序主体传递的参数)为 00。如果当前单元格有上方的相邻单元格,并且需要将卵石从当前单元格移动到那里,则应重写此值,使其等于相应的卵石数量。
  7. right — 此参数的初始值为 00。如果当前单元格有右侧的相邻单元格,并且需要将卵石从当前单元格移动到那里,则应重写此值,使其等于相应的卵石数量。
  8. bottom — 此参数的初始值为 00。如果当前单元格有下方的相邻单元格,并且需要将卵石从当前单元格移动到那里,则应重写此值,使其等于相应的卵石数量。
  9. left — 此参数的初始值为 00。如果当前单元格有左侧的相邻单元格,并且需要将卵石从当前单元格移动到那里,则应重写此值,使其等于相应的卵石数量。

参数 top, right, bottom, left 的最终值必须为非负数,并且它们的总和不应超过 pebbles 的值。 在每一步中,函数必须仅根据该步传递给它的数据来确定移动。函数的运行结果不应以任何方式受先前与程序主体的交互影响。此外,函数必须是确定性的,即对于固定的输入数据,总是返回相同的值。

编译与运行

在「文件」中,提供了一个主程序 automaton_tester.* 的示例,该程序会在您创建的输入文件中给定的输入数据上运行 automaton 函数,并输出表格的最终状态(如果自动机尚未停止,则输出 10,00010,000 次迭代后的状态)。要使用此程序,请将其与包含您函数实现的 automaton.* 文件放在同一目录中,并在此目录中创建一个 automaton.dat 文件,其结构如下一段所述。请注意,用于评估您的函数的程序主体将与提供给您的 automaton_tester.* 示例不同。特别是在检查期间,可能会对表格的任意单元格和 11200200 之间的任意卵石数量调用该函数。

1
1
5 3 4

0 7

数据范围与提示

  • 表格大小可以是 551010 之间的任意整数。
  • 输入数字的值可以是 11100100 之间的任意值。
  • 自动机停止前的迭代次数不应超过 10,00010,000 次。