本项目使用 quom 生成单文件代码。首次使用前请先安装:
pip install quom日常开发只需要修改 src/ 目录下的代码。
在 VS Code 中按 Ctrl+Shift+B 执行默认 Build 任务后,会自动完成配置和构建,并在 build/ 目录生成以下产物:
./build/Solution
./build/Solution.cpp
./build/DebugRunner其中:
Solution是本地调试用可执行文件。Solution.cpp是由quom拼接出的单文件版本。DebugRunner是调试阶段用于生成交互输入的辅助程序。
如果需要在命令行手动构建,也可以执行:
cmake -S . -B build
cmake --build build构建完成后,打开 VS Code 的调试页面,在调试配置中选择对应的数据集,例如:
Debug Solution practice_1
Debug Solution practice_2
...
Debug Solution practice_7
不同调试项对应不同的 data/practice_*.in 输入数据,你可以在调试页面直接切换想要使用的测试数据。
启动调试时,VS Code 会自动:
- 调用
DebugRunner生成调试输入。 - 启动
build/Solution进行交互式调试。 - 将调试输出写入
build/practice_*.solution.out。
在需要按官方单文件方式运行时,执行:
bash run_and_test.sh ./data/practice_1.in脚本只需要传入一个 input_file,例如 ./data/practice_1.in。运行时会自动:
- 使用
tools/exact_oracle.py生成oracle_output/*.out。 - 使用
tools/embed_out_to_python.py和tools/Oracle_solution.template.py生成单文件提交脚本./Oracle_solution.py。 - 按官方
PYTHON方式运行这个单文件版本。 - 将结果输出到
./output/目录,输出文件名与输入文件名一致,仅把.in改为.out。 - 在项目根目录生成或更新
./Solution.zip,压缩包内包含Oracle_solution.py,可直接用于提交。
例如:
./data/practice_1.in -> ./output/practice_1.out如果你刚修改过离线 Oracle 工具,建议先手动运行一次相关脚本,确认 oracle_output/ 和生成的 Oracle_solution.py 符合预期。
如果你只关心 Oracle 提交链路,不需要手动生成 Oracle_solution.py;run_and_test.sh 会自动完成 .out 生成和嵌入。
可以使用 tools/shapely_fuzzer.py 对 output/*.out 做离线校验。脚本会读取对应的 data/*.in,
用 Shapely 检查。默认容差对齐官方判题公式,即输出向量到精确 MTV 的欧氏距离不超过 1e-4:
- 已重叠的 query,输出向量是否落在精确 MTV 集合的
1e-4误差范围内。 - 原本已分离或仅接触的 query,是否等价于返回零向量(误差不超过
1e-4)。 - 若存在多个等价最优 MTV,接受任意一个
1e-4误差范围内的答案。 - 对于校验失败的 case,自动调用
tools/Visualize.py生成图片并保存到figures/,默认每个数据集最多保存 5 张。
首次使用前请先安装:
pip install shapely常用命令:
# 校验 output/ 目录下所有已有 .out 文件
python3 tools/shapely_fuzzer.py
# 只校验 practice_1
python3 tools/shapely_fuzzer.py practice_1
# 显式指定输入/输出目录
python3 tools/shapely_fuzzer.py --input-dir data --output-dir output
# 指定失败图片输出目录
python3 tools/shapely_fuzzer.py --figures-dir figures
# 调整每个数据集的失败图片上限
python3 tools/shapely_fuzzer.py --max-failure-figures-per-dataset 10