银行家算法:Python、C++、Java 多语言实现资源安全状态判断与安全序列输出
以下是使用 Python 语言实现的银行家算法: ```python def banker_algorithm(): resource = list(map(int, input().split())) processes = [] for _ in range(4): process_info = input().split() claim = list(map(int, process_info[1:4])) allocation = list(map(int, process_info[4:])) processes.append([process_info[0], claim, allocation]) available = [resource[i] - sum([p[2][i] for p in processes]) for i in range(3)] finish = [False] * 4 work = available.copy() safe_sequence = [] while False in finish: found = False for i, process in enumerate(processes): if not finish[i] and all(work[j] >= process[1][j] - process[2][j] for j in range(3)): work = [work[j] + process[2][j] for j in range(3)] finish[i] = True safe_sequence.append(process[0]) found = True if not found: print("false") return print(" ".join(safe_sequence)) banker_algorithm() ``` 以下是使用 C++语言实现的银行家算法: ```cpp #include <iostream> #include <vector> #include <string> using namespace std; bool isSafe(vector<int> resource, vector<vector<int>> processes) { vector<int> available; vector<bool> finish(processes.size(), false); vector<int> work; for (int i = 0; i < 3; i++) { int sum_allocated = 0; for (const auto& process : processes) { sum_allocated += process[2][i]; } available.push_back(resource[i] - sum_allocated); } work = available; while (true) { bool found = false; for (size_t i = 0; i < processes.size(); i++) { if (!finish[i] && all_of(processes[i][1].begin(), processes[i][1].end(), [&](int claim, size_t j) { return work[j] >= claim - processes[i][2][j]; })) { for (int j = 0; j < 3; j++) { work[j] += processes[i][2][j]; } finish[i] = true; found = true; } } if (!found) { return false; } bool allFinished = true; for (const auto& f : finish) { if (!f) { allFinished = false; break; } } if (allFinished) { return true; } } } void printSafeSequence(vector<string> processNames, vector<bool> finish) { for (size_t i = 0; i < finish.size(); i++) { if (finish[i]) { cout << processNames[i] << " "; } } cout << endl; } int main() { vector<int> resource(3); cin >> resource[0] >> resource[1] >> resource[2]; vector<vector<int>> processes(4, vector<int>(7)); vector<string> processNames(4); for (int i = 0; i < 4; i++) { cin >> processNames[i]; for (int j = 0; j < 7; j++) { cin >> processes[i][j]; } } if (isSafe(resource, processes)) { vector<bool> finish(4, false); printSafeSequence(processNames, finish); } else { cout << "false" << endl; } return 0; } ``` 以下是使用 Java 语言实现的银行家算法: ```java import java.util.Scanner; public class BankerAlgorithm { public static boolean isSafe(int[] resource, int[][] processes) { int[] available = new int[3]; boolean[] finish = new boolean[4]; int[] work = new int[3]; for (int i = 0; i < 3; i++) { int sumAllocated = 0; for (int[] process : processes) { sumAllocated += process[2 * i + 4]; } available[i] = resource[i] - sumAllocated; } System.arraycopy(available, 0, work, 0, 3); while (true) { boolean found = false; for (int i = 0; i < 4; i++) { if (!finish[i] && allResourcesAvailable(work, processes[i])) { for (int j = 0; j < 3; j++) { work[j] += processes[i][2 * j + 4]; } finish[i] = true; found = true; } } if (!found) { return false; } boolean allFinished = true; for (boolean f : finish) { if (!f) { allFinished = false; break; } } if (allFinished) { return true; } } } public static boolean allResourcesAvailable(int[] work, int[] process) { for (int i = 0; i < 3; i++) { if (work[i] < process[2 * i] - process[2 * i + 1]) { return false; } } return true; } public static void printSafeSequence(String[] processNames, boolean[] finish) { for (int i = 0; i < 4; i++) { if (finish[i]) { System.out.print(processNames[i] + " "); } } System.out.println(); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] resource = new int[3]; resource[0] = scanner.nextInt(); resource[1] = scanner.nextInt(); resource[2] = scanner.nextInt(); int[][] processes = new int[4][7]; String[] processNames = new String[4]; for (int i = 0; i < 4; i++) { processNames[i] = scanner.next(); for (int j = 0; j < 7; j++) { processes[i][j] = scanner.nextInt(); } } if (isSafe(resource, processes)) { boolean[] finish = new boolean[4]; printSafeSequence(processNames, finish); } else { System.out.println("false"); } scanner.close(); } } ``` ######[AI写代码神器 | 1627点数解答 | 2024-11-18 16:34:36]
- Java 实现复制粘贴功能:打造简易文本复制粘贴程序(GPT | 1497点数解答 | 2024-08-25 09:40:33)438
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)499
- 求解特定条件下整数序列的最小值:算法分析与代码实现(字节豆包 | 746点数解答 | 2026-01-24 13:14:40)74
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)451
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)443
- 解决数据库“dm.jdbc.driver.dmexception: 数据溢出”问题的全步骤指南(阿里通义 | 598点数解答 | 2024-10-15 15:48:38)337
- 达梦数据库数据溢出问题排查及多维度解决方法(阿里通义 | 403点数解答 | 2024-10-15 15:48:41)1232
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)384
- 基于商品效期规则的本地网页管理系统,无需服务器和网络,单HTML文件本地浏览器运行。 商品效期规则: 保质期≥12个月:临期提醒提前45天,下架提前5天(含过期提醒) 6个月≤保质期<12个月:临期提醒提前20天,下架提前3天(含过期提醒) 3个月≤保质期<6个月:临期提醒提前15天,下架提前3天(含过期提醒) 30天≤保质期<3个月:临期提醒提前10天,下架提前3天(含过期提醒) 15天≤保质期<30天:临期提醒提前5天,下架提前3天(含过期提醒) 保质期≤15天:临期提醒提前3天,下架提前2天(含过期提醒) 一定要遵守上门这个规则,状态以上位置,需要一一对应。 严格遵循 6 级保质期规则 → 自动计算「临期/下架/过期」状态(绿/黄/红) 产品管理模块: 商品列表展示:序号、名称、类别、生产日期、保质期、到期日、剩余天数(带单位)、状态(正常/临期/下架(一定要注意,选择类型要根据选择显示),对应绿/黄/红颜色)、操作(编辑、删除、备注),默认按照后添加先排,还需要根据一些条件,比如剩余天数可以筛选排序。 功能:添加商品(弹窗形式,保质期仅支持"XX天"或"XX月"格式)(讯飞星火 | 2053点数解答 | 2026-04-01 23:04:48)34
- Java调用Python接口中文乱码?设置UTF - 8编码一招解决!(讯飞星火 | 263点数解答 | 2024-06-06 17:07:59)422
- 解决Java调用Python接口中文乱码问题:设置UTF - 8编码全攻略(讯飞星火 | 160点数解答 | 2024-06-06 17:18:39)445
- Java调用Python接口中文乱码问题:字符编码统一解决方案(讯飞星火 | 344点数解答 | 2024-06-06 17:19:55)553