軍事演習演算法

蝴蝶自由發表於2024-03-21

題目描述
軍事演習中分為紅藍兩方,我方為藍方。
地圖簡化為 n 行 m 列的二維矩陣形式,紅方基地在地圖中使用 # 表示,藍方基地在地圖中使用 * 表示,中立區域使用 . 表示。
下圖為地圖示例:
.........###...............
........###..............
.........###....****.......
........#####.....
....
.........##............
...........................
.............
...........
......###....
...........
......##...................
......................
...
...##................
...
...........................
兩方均只使用戰鬥機進行演練,各個基地停放若干架戰鬥機並儲存若干戰備(燃油、導彈)。
戰鬥機在地圖中可向上、下、左、右四個方向進行移動,假定各戰鬥機在行駛途中有各自飛行高度而不會相撞。所有戰鬥機的速度均為 1 格 / 幀,
空中每經過一幀消耗一單位油量,攻擊距離均為 1 格。各戰鬥機具有的屬性為:
編號
油箱容量
最大載彈量
戰鬥機可以在起飛的基地進行加油和裝彈,也可以在途經的己方基地加油和裝彈,裝填時間不計。
出於隱蔽考慮,戰鬥機不應經過未被摧毀的敵方基地,而每架戰鬥機都可以向其上下左右四個方向發射導彈,射程為 1 格。同時不能飛出地圖邊
界。戰鬥機中途可以在非敵方基地處降落(不發出移動指令則視為降落)。
基地中各個位置均具有其初始屬性:
基地編號
戰鬥機數量及其屬性
燃油儲備量
導彈儲備量
防禦數值
軍事價值
其中,防禦數值指的是,徹底摧毀該基地所需要的導彈數(可以累加)。當徹底摧毀某個基地後,才可得到對應軍事價值的分數。
這是一個簡化的問題,所以你只需要考慮作為藍方如何排程戰鬥機進攻紅方基地,不需要考慮紅方對此做出的反擊或防禦措施,目標為得分最大
化。
輸入格式
第一行兩個正整數 n, m(1 ≤ n, m ≤ 200) 說明地圖表示為一個 n 行 m 列的矩陣。
接下來 n 行,每行 m 個字元,表示地圖情況。
如:
9 6
......
..
..#......
.##......
.......
.
......***
...#.....
對於一個基地,先輸入一行 表示接下來要描述位於第 行第 列的基地資訊。
接下來一行 個整數分別表示該位置編號 、該位置的戰鬥機數量 、燃油儲備量 、導彈儲備量
、防禦數值 、軍事價值 。保證編號連續且從 開始。
接下來 行,一行三個整數,分別表示一架戰鬥機的編號、油箱容量、最大載彈量。
保證先輸入藍方基地資訊,再輸入紅方基地資訊。例如上圖中有 個藍方基地, 個紅方基地。
輸出格式
對於每一幀,輸出若干行戰鬥機指令。
指令格式 作用
move 該指令表示戰鬥機的移動。第一個引數為移動的戰鬥機編號,第二個引數為移動方向的編號。 1 2 3 4 分別表示
“上、下、左、右”。若執行該指令後戰鬥機下一位置超出地圖邊界或進入未被摧毀的敵方基地,該指令將被忽略。
attack
該指令表示戰鬥機的進攻。第一個引數為進攻的戰鬥機編號,第二個引數為攻擊方向的編號。 1 2 3 4 分別表示
“上、下、左、右”。無條件打擊攻擊位置,即使為己方基地。(己方基地也可能被摧毀)
若攻擊位置超出地圖邊界,仍然消耗導彈,但沒有實際作用。
fuel
該指令表示為戰鬥機新增燃油。第一個引數為新增燃油的戰鬥機編號,第二個引數為新增燃油的數量。
若執行該指令時戰鬥機不位於基地或新增燃油的數量不合法(超過基地剩餘油量或新增後大於該戰鬥機油量),
該指令將被忽略。
missile
該指令表示為戰鬥機裝填導彈。第一個引數為裝填導彈的戰鬥機編號,第二個引數為裝填導彈的數量。
若執行該指令時戰鬥機不位於基地或新增導彈的數量不合法
(超過基地剩餘導彈量或新增後大於該戰鬥機載彈量),該指令將被忽略。
一幀輸出結束後,輸出一行 OK 並重新整理輸出。
例如:
C++ 可以使用 fflush(stdout) 或者 cout.flush() ;
Java 可以使用 System.out.flush() ;
Pascal 可以使用 flush(output) ;
Python 可以使用 stdout.flush() 。
每一幀輸出 OK 後,判題器將會返回當前得分資訊以及該幀的錯誤指令警告資訊。
總共 幀,每一幀的處理時間不受限,但需要保證程式在 分鐘內結束。

相關文章