#2435. 消除游戏【SPJ问题】

消除游戏【SPJ问题】

题目描述

最近,小 Z 迷上了一款新型消除游戏。这款游戏在一个 n×mn\times m 的方格中进行。初始时方格中均为 0∼90 \sim 9 的整数。进行消除后方格中会出现空白,用 −1-1 表示。为了方便,我们将第 ii 行,第 jj 列的数记为 Ai,jA_{i,j},并将其坐标记为 (i,j)(i,j)。

给定三个参数 lmin⁡,lmax⁡l_{\min},l_{\max} 以及 KK,玩家可以进行不超过 KK 次操作。对于每次操作,玩家需要在方格中找到一条长度为 ll 的路径。形式化地,该路径用两个长度为 ll 的序列 x1,x2,…,xlx_1,x_2,\ldots,x_l 和 y1,y2,…,yly_1,y_2,\ldots,y_l 表示,需要满足如下条件:

  1. 1≤xi≤n,1≤yi≤m1\le x_i\le n,1\le y_i\le m,其中 1≤i≤l1\le i\le l,即 (xi,yi)(x_i,y_i) 对应于方格中的一个合法位置;
  2. ∣xi−xi+1∣+∣yi−yi+1∣=1\left|x_i-x_{i+1} \right|+ \left|y_i-y_{i+1} \right|=1,其中 1≤i<l1 \le i \lt l,即 (xi,yi)(x_i,y_i) 与 (xi+1,yi+1)(x_{i+1},y_{i+1}) 是方格中相邻的两个位置;
  3. xi≠xjx_i \neq x_j 或 yi≠yjy_i \neq y_j,其中 1≤i<j≤l1\le i \lt j\le l,即路径不能经过重复的格子;
  4. Axi,yi≠−1A_{x_i,y_i} \neq -1,其中 1≤i≤l1\le i\le l,即路径不能经过空白的格子;
  5. Ax1,y1≠0A_{x_1,y_1} \neq 0,即路径不能以数字 00 为起点;
  6. lmin⁡≤l≤lmax⁡l_{\min}\le l\le l_{\max},即路径的长度需要在给定的范围内。

将路径上的数字串成一个整数 NN,形式化地

N=∑i=1lAxi,yi×10l−iN=\sum\limits_{i=1}^l A_{x_i,y_i}\times 10^{l-i}

游戏会给出两个参数 c1,c2c_1,c_2 用于计算玩家本次操作的得分:

  1. 如果数 NN 是质数,那么将获得质数得分 lc1l^{c_1},否则获得质数得分 11;
  2. 如果数 NN 是回文数(即,将数 NN 的十进制表达看成一个字符串,这个字符串的逆序串和它本身完全相同),那么将获得回文数得分 lc2l^{c_2},否则获得回文数得分 11;
  3. 如果质数得分和回文数得分均为 11,那么本次操作的得分为 00;否则本次操作的得分为质数得分与回文数得分之和。

每次操作过后,若该次操作的得分等于 00,那么你浪费了一次操作机会,而局面不会有任何改变。若该次操作的得分大于 00,则将路径上的数替换为空白,并使空白上方的数字垂直下落。形式化地,执行以下操作:

  1. 执行 Axi,yi←−1A_{x_i,y_i}\leftarrow -1,其中 1≤i≤l1\le i\le l;
  2. 枚举所有格子。如果存在某个格子 (i,j)(i ,j),满足 i≠n,Ai,j≠−1,Ai+1,j=−1i \neq n, A_{i,j} \neq -1, A_{i+1,j} = -1,执行 Ai+1,j←Ai,j,Ai,j←−1A_{i+1,j} \leftarrow A_{i,j}, A_{i,j}\leftarrow -1。反复执行这个操作直到方格中不再存在这样的格子。

我们还会给你一个参数 FF ,在所有操作完成后,玩家的最终得分 SS 的计算方式由 FF 决定:如果 FF 取值为 00,那么玩家的最终得分为所有操作的分数总和 mm;如果 FF 取值为 11,那么玩家的最终得分为所有操作的分数总和 mm 除 2d2^d 后向下取整,即

S={m,F=0⌊m2d⌋,F=1\begin{equation} S = \begin{cases} m, & F=0\\\\ \left \lfloor \frac{m}{2^d} \right \rfloor, & F=1 \end{cases} \end{equation}

其中 dd 为最终方格中非空白格子的数目。

小 Z 沉迷于这个有趣的游戏中不能自拔。她想请你帮助, 针对给定的输入参数,给出游戏局面的操作方案。当然,最终得分越大越好。

输入格式

所有输入数据 game1.in ~ game10.in 见附加文件。 输入的第 11 行包含 88 个用空格分隔的整数 n,m,K,lmin⁡,lmax⁡,c1,c2,Fn, m, K, l_{\min}, l_{\max}, c_1, c_2, F,含义同题面描述。

随后 nn 行,每行 mm 个整数,表示方格 A。数之间用一个空格分隔。

输入文件中不会包含多余的空行,行末不会存在多余的空格。

输出格式

针对给定的 1010 个输入文件 game1.in ~ game10.in,你需要分别提交你的输出文件 game1.out ~ game10.out。

输出文件第 11 行为一个整数 M(0≤M≤K)M (0 \leq M \leq K),为你的操作次数。

随后, 输出文件还应包含 MM 行,每行描述一次操作。对于每一行,最开始的整数ll表示这次操作中选定路径的长度。接下来有 2l2l 个数字,分别为 x1,y1,x2,y2,…,xl,ylx_1, y_1, x_2, y_2, \dots, x_l, y_l。

输出文件中不应包含多余的空格和空行。一行的多个整数之间使用一个空格分隔。

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

数据范围与提示

对于每组数据,我们设置了 99 个评分参数 a10,a9,…,a2a_{10},a_9, \dots ,a_2。如果选手的输出不合法,则得零分。否则,在你的方案中,若游戏得分为 wuserw_{user},你的分数将会由下表给出:

得分 条件 得分 条件
1010 wuser≥a10w_{user}\ge a_{10} 55 a5≤wuser<a6a_5\le w_{user}\lt a_6
99 a9≤wuser<a10a_9\le w_{user}\lt a_{10} 44 a4≤wuser<a5a_4\le w_{user}\lt a_5
88 a8≤wuser<a9a_8\le w_{user}\lt a_9 33 a3≤wuser<a4a_3\le w_{user}\lt a_4
77 a7≤wuser<a8a_7\le w_{user}\lt a_8 22 a2≤wuser<a3a_2\le w_{user}\lt a_3
66 a6≤wuser<a7a_6\le w_{user}\lt a_7 11 0<wuser<a20\lt w_{user}\lt a_2

如何测试你的输出

附加文件中提供了 checker.cpp,需要自行编译来测试输出。

编译命令如下:

g++ checker.cpp -o checker -O2

然后,在终端(Linux)中输入以下命令:

./checker <case_no>

或在命令提示符(Windows)中输入以下命令:

checker <case_no>

来测试输出。其中 <case_no> 为测试点的编号,请将要测试的 game*.in/out 与 checker 放置于同一目录下。