#NOI2014D. 消除游戏【SPJ问题】
消除游戏【SPJ问题】
题目描述
最近,小 Z 迷上了一款新型消除游戏。这款游戏在一个 的方格中进行。初始时方格中均为 的整数。进行消除后方格中会出现空白,用 表示。为了方便,我们将第 行,第 列的数记为 ,并将其坐标记为 。
给定三个参数 以及 ,玩家可以进行不超过 次操作。对于每次操作,玩家需要在方格中找到一条长度为 的路径。形式化地,该路径用两个长度为 的序列 和 表示,需要满足如下条件:
- ,其中 ,即 对应于方格中的一个合法位置;
- $\left|x_i-x_{i+1} \right|+ \left|y_i-y_{i+1} \right|=1$,其中 ,即 与 是方格中相邻的两个位置;
- 或 ,其中 ,即路径不能经过重复的格子;
- ,其中 ,即路径不能经过空白的格子;
- ,即路径不能以数字 为起点;
- ,即路径的长度需要在给定的范围内。
将路径上的数字串成一个整数 ,形式化地
游戏会给出两个参数 用于计算玩家本次操作的得分:
- 如果数 是质数,那么将获得质数得分 ,否则获得质数得分 ;
- 如果数 是回文数(即,将数 的十进制表达看成一个字符串,这个字符串的逆序串和它本身完全相同),那么将获得回文数得分 ,否则获得回文数得分 ;
- 如果质数得分和回文数得分均为 ,那么本次操作的得分为 ;否则本次操作的得分为质数得分与回文数得分之和。
每次操作过后,若该次操作的得分等于 ,那么你浪费了一次操作机会,而局面不会有任何改变。若该次操作的得分大于 ,则将路径上的数替换为空白,并使空白上方的数字垂直下落。形式化地,执行以下操作:
- 执行 ,其中 ;
- 枚举所有格子。如果存在某个格子 ,满足 ,执行 。反复执行这个操作直到方格中不再存在这样的格子。
我们还会给你一个参数 ,在所有操作完成后,玩家的最终得分 的计算方式由 决定:如果 取值为 ,那么玩家的最终得分为所有操作的分数总和 ;如果 取值为 ,那么玩家的最终得分为所有操作的分数总和 除 后向下取整,即
$$\begin{equation} S = \begin{cases} m, & F=0\\\\ \left \lfloor \frac{m}{2^d} \right \rfloor, & F=1 \end{cases} \end{equation} $$其中 为最终方格中非空白格子的数目。
小 Z 沉迷于这个有趣的游戏中不能自拔。她想请你帮助, 针对给定的输入参数,给出游戏局面的操作方案。当然,最终得分越大越好。
输入格式
所有输入数据 game1.in ~ game10.in
见附加文件。 输入的第 行包含 个用空格分隔的整数 ,含义同题面描述。
随后 行,每行 个整数,表示方格 A。数之间用一个空格分隔。
输入文件中不会包含多余的空行,行末不会存在多余的空格。
输出格式
针对给定的 个输入文件 game1.in ~ game10.in
,你需要分别提交你的输出文件 game1.out ~ game10.out
。
输出文件第 行为一个整数 ,为你的操作次数。
随后, 输出文件还应包含 行,每行描述一次操作。对于每一行,最开始的整数表示这次操作中选定路径的长度。接下来有 个数字,分别为 。
输出文件中不应包含多余的空格和空行。一行的多个整数之间使用一个空格分隔。
3 3 100 2 3 1 1 0
2 1 1
2 3 3
4 7 1
4
2 2 2 3 2
2 3 1 3 2
2 2 1 3 1
3 1 3 2 3 3 3
1 3 100 2 3 1 1 1
2 1 1
1
2 1 2 1 3
数据范围与提示
对于每组数据,我们设置了 个评分参数 。如果选手的输出不合法,则得零分。否则,在你的方案中,若游戏得分为 ,你的分数将会由下表给出:
得分 | 条件 | 得分 | 条件 |
---|---|---|---|
如何测试你的输出
附加文件中提供了 checker.cpp
,需要自行编译来测试输出。
编译命令如下:
g++ checker.cpp -o checker -O2
然后,在终端(Linux)中输入以下命令:
./checker <case_no>
或在命令提示符(Windows)中输入以下命令:
checker <case_no>
来测试输出。其中 <case_no>
为测试点的编号,请将要测试的 game*.in/out
与 checker
放置于同一目录下。