题目描述
军事演习中分为红蓝两方,我方为蓝方。
地图简化为 n 行 m 列的二维矩阵形式,红方基地在地图中使用 # 表示,蓝方基地在地图中使用 * 表示,中立区域使用 . 表示。
下图为地图示例:
.........###...............
........###..............
.........###....****.......
........#####.........
.........##............
...........................
........................
......###...............
......##...................
.........................
...##...................
...........................
两方均只使用战斗机进行演练,各个基地停放若干架战斗机并存储若干战备(燃油、导弹)。
战斗机在地图中可向上、下、左、右四个方向进行移动,假定各战斗机在行驶途中有各自飞行高度而不会相撞。所有战斗机的速度均为 1 格 / 帧,
空中每经过一帧消耗一单位油量,攻击距离均为 1 格。各战斗机具有的属性为:
编号
油箱容量
最大载弹量
战斗机可以在起飞的基地进行加油和装弹,也可以在途经的己方基地加油和装弹,装填时间不计。
出于隐蔽考虑,战斗机不应经过未被摧毁的敌方基地,而每架战斗机都可以向其上下左右四个方向发射导弹,射程为 1 格。同时不能飞出地图边
界。战斗机中途可以在非敌方基地处降落(不发出移动指令则视为降落)。
基地中各个位置均具有其初始属性:
基地编号
战斗机数量及其属性
燃油储备量
导弹储备量
防御数值
军事价值
其中,防御数值指的是,彻底摧毁该基地所需要的导弹数(可以累加)。当彻底摧毁某个基地后,才可得到对应军事价值的分数。
这是一个简化的问题,所以你只需要考虑作为蓝方如何调度战斗机进攻红方基地,不需要考虑红方对此做出的反击或防御措施,目标为得分最大
化。
输入格式
第一行两个正整数 n, m(1 ≤ n, m ≤ 200) 说明地图表示为一个 n 行 m 列的矩阵。
接下来 n 行,每行 m 个字符,表示地图情况。
如:
9 6
........
..#......
.##......
........
......***
...#.....
对于一个基地,先输入一行 表示接下来要描述位于第 行第 列的基地信息。
接下来一行 个整数分别表示该位置编号 、该位置的战斗机数量 、燃油储备量 、导弹储备量
、防御数值 、军事价值 。保证编号连续且从 开始。
接下来 行,一行三个整数,分别表示一架战斗机的编号、油箱容量、最大载弹量。
保证先输入蓝方基地信息,再输入红方基地信息。例如上图中有 个蓝方基地, 个红方基地。
输出格式
对于每一帧,输出若干行战斗机指令。
指令格式 作用
move
“上、下、左、右”。若执行该指令后战斗机下一位置超出地图边界或进入未被摧毁的敌方基地,该指令将被忽略。
attack
该指令表示战斗机的进攻。第一个参数为进攻的战斗机编号,第二个参数为攻击方向的编号。 1 2 3 4 分别表示
“上、下、左、右”。无条件打击攻击位置,即使为己方基地。(己方基地也可能被摧毁)
若攻击位置超出地图边界,仍然消耗导弹,但没有实际作用。
fuel
该指令表示为战斗机添加燃油。第一个参数为添加燃油的战斗机编号,第二个参数为添加燃油的数量。
若执行该指令时战斗机不位于基地或添加燃油的数量不合法(超过基地剩余油量或添加后大于该战斗机油量),
该指令将被忽略。
missile
该指令表示为战斗机装填导弹。第一个参数为装填导弹的战斗机编号,第二个参数为装填导弹的数量。
若执行该指令时战斗机不位于基地或添加导弹的数量不合法
(超过基地剩余导弹量或添加后大于该战斗机载弹量),该指令将被忽略。
一帧输出结束后,输出一行 OK 并刷新输出。
例如:
C++ 可以使用 fflush(stdout) 或者 cout.flush() ;
Java 可以使用 System.out.flush() ;
Pascal 可以使用 flush(output) ;
Python 可以使用 stdout.flush() 。
每一帧输出 OK 后,判题器将会返回当前得分信息以及该帧的错误指令警告信息。
总共 帧,每一帧的处理时间不受限,但需要保证程序在 分钟内结束。