#L2247. 「NOI2014」消除游戏

「NOI2014」消除游戏

题目重排

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

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

  1. 1xin,1yim1 \le x_i \le n, 1 \le y_i \le m1il1 \le i \le l),即 (xi,yi)(x_i,y_i) 对应方格中的合法位置;
  2. xixi+1+yiyi+1=1|x_i - x_{i+1}| + |y_i - y_{i+1}| = 11i<l1 \le i < l),即路径相邻位置在方格中相邻;
  3. xixjx_i \neq x_jyiyjy_i \neq y_j1i<jl1 \le i < j \le l),即路径不经过重复格子;
  4. Axi,yi1A_{x_i,y_i} \neq -11il1 \le i \le l),即路径不经过空白格子;
  5. Ax1,y10A_{x_1,y_1} \neq 0,即路径不能以数字 00 为起点;
  6. lminllmaxl_{\min} \le l \le l_{\max},即路径长度在给定范围内。

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

N=i=1lAxi,yi×10liN = \sum_{i=1}^l A_{x_i,y_i} \times 10^{l-i}

游戏给出两个参数 c1,c2c_1,c_2 计算本次操作得分:

  • NN 是质数,质数得分为 lc1l^{c_1},否则为 11
  • NN 是回文数(十进制字符串逆序与原串相同),回文数得分为 lc2l^{c_2},否则为 11
  • 若两者均为 11,本次操作得分为 00;否则得分为两者之和。

每次操作后,若得分大于 00,则将路径上的数替换为空白(Axi,yi1A_{x_i,y_i} \leftarrow -1),并使空白上方的数字垂直下落:枚举所有格子,若存在 (i,j)(i,j) 满足 ini \neq nAi,j1A_{i,j} \neq -1Ai+1,j=1A_{i+1,j} = -1,则执行 Ai+1,jAi,jA_{i+1,j} \leftarrow A_{i,j}Ai,j1A_{i,j} \leftarrow -1,反复执行直到无此类格子。若得分等于 00,则浪费一次操作机会,局面不变。

另有参数 FF 决定最终得分 SS 的计算方式:

$$S = \begin{cases} m_{\text{总}} & F=0 \\ \left\lfloor \frac{m_{\text{总}}}{2^d} \right\rfloor & F=1 \end{cases}$$

其中 mm_{\text{总}} 为所有操作的分数总和,dd 为所有操作完成后方格中非空白格子的数目。

小 Z 希望得到尽可能大的最终得分,需针对给定输入参数给出操作方案。

输入格式

所有输入数据为 game1.in ~ game10.in。输入第 1 行包含 8 个整数 n,m,K,lmin,lmax,c1,c2,Fn, m, K, l_{\min}, l_{\max}, c_1, c_2, F,含义同题面。 随后 nn 行,每行 mm 个整数,表示方格 AA,数之间用空格分隔。 输入文件无多余空行,行末无多余空格。

输出格式

针对每个输入文件,输出对应 game1.out ~ game10.out。 输出第 1 行为整数 MM0MK0 \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。 输出文件无多余空格和空行,一行中多个整数用空格分隔。

样例 1

输入:

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

说明:4 次消除得到的数与分数分别为 37(3 分)、41(3 分)、22(3 分)、131(6 分),总得分 15,可能存在更优方案。

样例 2

输入:

1 3 100 2 3 1 1 1
2 1 1

输出:

1
2 1 2 1 3

说明:消除的数为 11,本次得分为 4。因 F=1F=1,最终得分 4/21=2\lfloor 4 / 2^1 \rfloor = 2。若选择路径 211,可获得局面最佳分数 4。

数据范围与提示

每组数据设置 9 个评分参数 a10,a9,,a2a_{10},a_9,\dots,a_2。输出不合法得零分;否则根据用户方案得分 wuserw_{user} 按以下规则计分:

得分 条件 得分 条件
10 wusera10w_{user} \ge a_{10} 5 a5wuser<a6a_5 \le w_{user} < a_6
9 a9wuser<a10a_9 \le w_{user} < a_{10} 4 a4wuser<a5a_4 \le w_{user} < a_5
8 a8wuser<a9a_8 \le w_{user} < a_9 3 a3wuser<a4a_3 \le w_{user} < a_4
7 a7wuser<a8a_7 \le w_{user} < a_8 2 a2wuser<a3a_2 \le w_{user} < a_3
6 a6wuser<a7a_6 \le w_{user} < a_7 1 0<wuser<a20 < w_{user} < a_2

测试方法

附加文件提供 checker.cpp,编译命令:

g++ checker.cpp -o checker -O2

测试命令(Linux):

./checker <case_no>

测试命令(Windows):

checker <case_no>

其中 <case_no> 为测试点编号,需将 game*.in/out 与 checker 置于同一目录。