1 条题解
-
0
「PA 2018」Gra 题解
问题分析
这是一个策略游戏模拟问题,需要在网格地图上协调农民收集金币和坦克清除石头,最终将所有金币运回基地。
游戏规则:
- 地图: 网格,基地位于
- 角色:农民(收集金币,不能进入有石头的格子)、坦克(清除石头,可进入任何格子)
- 经济:初始 200 金币,招募角色各需 100 金币
- 移动:每轮每个角色最多移动一次
- 收集:农民每轮最多收集 10 金币,坦克每轮最多清除 10 石头
代码算法解析
核心架构:启发式搜索 + 贪心策略
主要组件:
- 路径规划系统(模板类
C1-C6) - 角色管理系统(
Unit结构体) - 决策引擎(
next_move函数) - 多轮优化(
game函数中的重试机制)
路径规划算法
代码实现了 6 种不同的路径规划策略:
// C1: 寻找最近的金币堆 struct C1 { static float dist(int, int, int, int) { return 1 + random1() / 100000; } static int score(int a, int b, float) { return map[a][b] > 0; } static bool end(int a, int b) { return map[a][b] > 0; } static bool walkable(int a, int b) { return map[a][b] >= 0 && units[a][b].type == Unit::None; } };其他路径策略:
C2: 寻找价值最高的金币堆C3: 寻路到指定坐标C4: 寻找空闲农民C5: 寻找最佳石头清除目标C6: 寻找最近的非金币格子
决策逻辑
角色招募策略:
if (stone_prob == 0) { recruit(1); // 无石头时直接招募农民 } else if (number_of_units == 0) { // 第一个角色:如果旁边有金币就招农民,否则招坦克 if (map[1][0] > 0 || map[0][1] > 0) recruit(1); else recruit(0); } else if (number_of_units == 1) { // 第二个角色:平衡农民和坦克数量 if (number_of_tanks == 0) recruit(0); else recruit(1); }农民移动策略:
- 优先收集高价值金币
- 背包金币达到阈值时返回基地
- 使用
dir_to_best_gold_pile和dir_to_nearest_gold_pile
坦克移动策略:
- 优先清除阻挡路径的石头
- 使用
dir_to_best_stone寻找最佳目标 - 空闲时移动到边缘区域
优化技术
- 随机化:在距离计算中加入随机因子,避免陷入局部最优
- 限制搜索深度:使用
limit参数控制路径搜索范围 - 动态角色数量限制:根据石头概率调整最大角色数
- 多轮重试:对每个测试用例进行多次尝试,选择最优解
算法流程
void game(int number, int limit) { do { // 初始化游戏状态 initialize_game(); // 游戏主循环 while (next_turn() && turn < limit) { // 每轮决策 } // 记录最优解 if (turn < best_score) { best_score = turn; best_solution = current_solution; } } while (未找到可行解); }复杂度分析
- 时间复杂度:$O(T \cdot \text{attempts} \cdot n^2 \cdot \text{turns})$
- 空间复杂度:
- 路径搜索:使用优先队列的 BFS,
关键优化点
- 启发式评估函数:综合考虑距离、金币价值、石头数量
- 角色协同:农民和坦克的移动策略相互配合
- 经济管理:合理分配金币招募角色
- 轮次优化:在限制轮数内完成目标
算法标签
- 启发式搜索
- 贪心算法
- 状态空间搜索
- BFS
总结
这个解法展示了在复杂约束下的智能体协同控制问题:
- 通过多种路径规划策略适应不同场景
- 使用启发式函数平衡探索与利用
- 实现农民与坦克的有效分工协作
- 在严格轮数限制下找到可行解
该算法结合了搜索、规划、优化等多种技术,是解决此类策略游戏问题的典型范例。
- 1
信息
- ID
- 5619
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者