#6480. C:桌子摆放 (Arrangement)

C:桌子摆放 (Arrangement)

题目 C:桌子摆放 (Arrangement)

属性 规格
输入文件 input_*.txt
输出文件 output_*.txt
时间限制 无限制(Output-only 任务)
内存限制 无限制
分值 100 分

题目描述

Ravi 新建了许多家餐厅,需要你帮他以最优的方式在餐厅内摆放桌子。

  • 餐厅模型:每个餐厅建模为一个 N×MN \times M 的网格。单元格分为三类:空地.)、障碍物#)或D)。每个餐厅有且仅有一个门。
  • 桌子类型:由若干相邻的 1×11 \times 1 单元格组成。每家餐厅只能使用指定的几种桌子类型,但每种类型的使用次数不限。
  • 摆放限制
    1. 桌子只能放在空地上,且不能重叠。
    2. 桌子不能旋转或翻转,必须保持 tables.txt 中给出的原始朝向。
  • 可到达性要求:对于放置的每一张桌子,必须满足:
    • 该桌子与门相邻;
    • 或者存在一条路径,其起点与门相邻,终点与该桌子的任意单元格相邻。
    • 路径定义:由一个或多个空地单元格组成的列表,且相邻单元格在网格中共享边。
  • 评分目标:每个餐厅都有一个目标覆盖格数 KK。覆盖的有效单元格越多,得分越高。

输入格式

这是一个 Output-only(仅需提交输出) 任务。你需要从比赛网站下载 tests.zip(包含输入文件)和 tables.txt

1. tables.txt 结构:

  • 第一行:总共的桌子种类数。
  • 随后每种桌子描述:
    • 第一行:a b c(类型编号 aa,占用 bbcc 列)。
    • 随后 bb 行:每行 cc 个字符。# 代表桌子组成部分,. 代表空位。

2. input_*.txt 结构:

  • 第一行:N M C K(行、列、可用桌子种数、目标覆盖数)。
  • 第二行:C 个整数,表示该餐厅允许使用的桌子类型编号。
  • 随后 NN 行:MM 个字符,描述餐厅布局(., #, D)。门 D 始终位于左边界。

输出格式

你需要为每个 input_x.txt 提交对应的 output_x.txt

  • 第一行:一个整数 TT,表示放置的桌子总数。
  • 随后 TT 行:每行三个整数 type r c
    • type:桌子类型编号。
    • r:垂直偏移量(距离顶部的行数,从 0 开始)。
    • c:水平偏移量(距离左侧的列数,从 0 开始)。

计分规则

共有 8 个测试点,每个 12.5 分。

  • 如果摆放不合法(重叠、越界、位置非空),该测试点得 0 分。
  • 如果某张桌子不可达(无法从门通过空地到达),该桌子将被忽略,不计入覆盖总数 LL
  • 得分公式(基于 L/KL/K 的比例): Score=40LK+40Score = 40 \cdot \frac{L}{K} + 40 \cdot (LK)2+20\left(\frac{L}{K}\right)^2 + 20 \cdot max(0,10LK9)\max\left(0, \frac{10 \cdot L}{K} - 9\right)

注:如果 LKL \ge K,该公式确保你获得 100% 的分数。