当前位置: 面试刷题>> 预测能否胜利 (经典算法题500道)
### 题目描述补充
**题目:预测能否胜利(战争模拟)**
在一场模拟的战争中,你有两支部队,分别称为`A`部队和`B`部队。每支部队由多个单位组成,每个单位有其特定的攻击力(attack power)和生命值(health points, HP)。战斗采用回合制,每个回合,双方各自选择一个单位进行攻击,被攻击的单位生命值减少攻击单位的攻击力数值。如果某个单位的生命值降至0或以下,则该单位被视为“阵亡”。
战斗的目标是彻底消灭对方所有单位。给定两支部队的单位列表(每个单位包含攻击力和生命值),预测并返回哪支部队能最终取得胜利,或者如果战斗会进入无限循环(即双方都没有能力消灭对方最后一个单位),则返回“平局”。
### 示例
**输入**:
- A部队单位列表:`[[5, 10], [3, 5]]`(表示A部队有两个单位,第一个单位攻击力5,生命值10;第二个单位攻击力3,生命值5)
- B部队单位列表:`[[4, 8]]`(表示B部队有一个单位,攻击力4,生命值8)
**输出**:`"A"`(A部队能最终取得胜利)
### PHP 示例代码
```php
function predictVictory($unitsA, $unitsB) {
while (!empty($unitsA) && !empty($unitsB)) {
// 选择攻击力最高的单位进行攻击(简化策略)
usort($unitsA, function($a, $b) { return $b[0] - $a[0]; });
usort($unitsB, function($a, $b) { return $b[0] - $a[0]; });
$attackA = array_shift($unitsA);
$attackB = array_shift($unitsB);
if ($attackA[0] >= $attackB[1]) {
// A部队的单位能够消灭B部队的单位
continue;
} else {
$attackB[1] -= $attackA[0];
if ($attackB[1] <= 0) {
// B部队的单位被消灭
continue;
} else {
// B部队的单位存活,重新加入队列
array_unshift($unitsB, $attackB);
}
}
// 同理处理B部队攻击A部队的情况
if ($attackB[0] >= $attackA[1] && !empty($unitsA)) {
$unitsA = []; // A部队单位被消灭
} elseif (!empty($unitsA)) {
$unitsA[0][1] -= $attackB[0];
if ($unitsA[0][1] <= 0) {
array_shift($unitsA); // 移除已阵亡的单位
}
}
}
return empty($unitsA) ? 'B' : (empty($unitsB) ? 'A' : '平局');
}
// 示例调用
$unitsA = [[5, 10], [3, 5]];
$unitsB = [[4, 8]];
echo predictVictory($unitsA, $unitsB); // 输出: A
```
### Python 示例代码
```python
def predict_victory(unitsA, unitsB):
while unitsA and unitsB:
# 简化处理,选择攻击力最大的单位
max_attackA = max(unitsA, key=lambda x: x[0])
max_attackB = max(unitsB, key=lambda x: x[0])
unitsA.remove(max_attackA)
unitsB.remove(max_attackB)
if max_attackA[0] >= max_attackB[1]:
continue # A部队消灭B部队单位
else:
max_attackB = [max_attackB[0], max_attackB[1] - max_attackA[0]]
if max_attackB[1] > 0:
unitsB.append(max_attackB)
if unitsA and max_attackB[0] >= unitsA[0][1]:
unitsA = [] # B部队消灭A部队剩余单位
elif unitsA:
unitsA[0] = [unitsA[0][0], unitsA[0][1] - max_attackB[0]]
if unitsA[0][1] <= 0:
unitsA.pop(0)
return 'B' if not unitsA else ('A' if not unitsB else '平局')
# 示例调用
unitsA = [[5, 10], [3, 5]]
unitsB = [[4, 8]]
print(predict_victory(unitsA, unitsB)) # 输出: A
```
### JavaScript 示例代码
```javascript
function predictVictory(unitsA, unitsB) {
while (unitsA.length > 0 && unitsB.length > 0) {
// 选择攻击力最大的单位
const maxA = unitsA.reduce((a, b) => a[0] > b[0] ? a : b);
const maxB = unitsB.reduce((a, b) => a[0] > b[0] ? a : b);
unitsA = unitsA.filter(unit => unit !== maxA);
unitsB = unitsB.filter(unit => unit !== maxB);
if (maxA[0] >= maxB[1]) {
continue; // A部队消灭B部队单位
} else {
const newMaxB = [maxB[0], maxB[1] - maxA[0]];
if (newMaxB[1] > 0) {
unitsB.push(newMaxB);
}
}
if (unitsA.length > 0 && maxB[0] >= unitsA[0][1]) {
unitsA = []; // B部队消灭A部队剩余单位
} else if (unitsA.length > 0) {
unitsA[0] = [unitsA[0][0], unitsA[0][1] - maxB[0]];
if (unitsA[0][1] <= 0) {
unitsA.shift();
}
}
}
return unitsA.length === 0 ? 'B' : (unitsB.length === 0 ? 'A' : '平局');
}
// 示例调用
const unitsA = [[5, 10], [3, 5]];
const unitsB = [[4, 8]];
console.log(predictVictory(unitsA, unitsB)); // 输出: A
```
**码小课网站中有更多相关内容分享给大家学习**,希望这些示例和描述能帮助你更好地理解和解决这类问题。