#AEAI06003. 目标投放任务链补全
目标投放任务链补全
题目描述
具身智能部把一次投放任务拆成若干个可复用模板:有的模板负责取到物体,有的负责移动到投放区,有的会清除临时状态。每个模板都有前置状态、增加状态和删除状态。给定初始状态和目标状态,你需要补出最短任务链。
状态用整数位掩码表示。若当前状态 st 满足 (st & pre) == pre,则可以执行该模板,得到新状态:
(st & ~delete) | add
若新状态与原状态相同,则这次执行不扩展搜索。目标达成条件为 (st & goal) == goal。请按模板编号升序进行 BFS,因此第一次到达目标时得到的就是步数最少、并在该搜索规则下最靠前的任务链。
输入格式
第一行输入 s task_count goal,其中 s 表示状态位数,task_count 表示模板数量,goal 为目标位掩码。第二行输入初始状态 start。
接下来 task_count 行,每行输入:
tid pre add delete cost
其中 tid 为模板编号。cost 只作为输入字段保留,本题搜索不使用它。
输出格式
若能达成目标,输出最短链长度,后接按执行顺序排列的模板编号:
len tid1 tid2 ...
若初始状态已经达成目标,只输出 0。若无法达成目标,输出:
TASK_UNREACHABLE
数据范围与测试提示
- 正式测试会覆盖样例没有出现的边界输入,请不要依赖样例规模或样例顺序写特判。
- 输出只包含题目要求的字段,不要输出调试信息;浮点结果按题面要求保留 6 位小数。
- 任务链可能已经完整,也可能缺少多个必要步骤;补全时要保留原有动作顺序约束。
- 若目标不可抓取、不可投放或中途资源不足,应按题面输出失败而不是生成部分计划。
- 初始状态已满足目标时只输出
0;不改变状态的模板不能扩展 BFS,模板按tid升序尝试。
样例
输入样例 1
8 7 127
1
1 1 2 0 1
2 3 4 0 1
3 5 8 0 1
4 9 16 0 1
5 16 32 0 1
6 32 64 0 1
7 64 128 0 1
输出样例 1
6 1 2 3 4 5 6
输入样例 2
4 2 3
3
1 0 1 0 1
2 1 2 0 1
输出样例 2
0