C语言实现银行家算法:判断系统资源分配安全状态并输出安全序列
```c #include <stdio.h> #include <stdbool.h> // 计算还需要的资源 void calculateNeed(int need[][3], int claim[][3], int allocation[][3], int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < 3; j++) { need[i][j] = claim[i][j] - allocation[i][j]; } } } // 检查资源是否足够 bool isSafe(int available[], int need[][3], int allocation[][3], int n, int work[], int finish[]) { for (int i = 0; i < n; i++) { if (finish[i] == 0) { bool flag = true; for (int j = 0; j < 3; j++) { if (need[i][j] > work[j]) { flag = false; break; } } if (flag) { for (int j = 0; j < 3; j++) { work[j] += allocation[i][j]; } finish[i] = 1; return true; } } } return false; } // 银行家算法 bool bankerAlgorithm(int available[], int claim[][3], int allocation[][3], int n) { int need[n][3]; calculateNeed(need, claim, allocation, n); int work[3]; for (int i = 0; i < 3; i++) { work[i] = available[i]; } int finish[n]; for (int i = 0; i < n; i++) { finish[i] = 0; } bool found = true; while (found) { found = isSafe(work, need, allocation, n, work, finish); } for (int i = 0; i < n; i++) { if (finish[i] == 0) { return false; } } return true; } // 打印安全序列 void printSafeSequence(int claim[][3], int allocation[][3], int n) { int available[3]; int need[n][3]; calculateNeed(need, claim, allocation, n); int work[3]; for (int i = 0; i < 3; i++) { work[i] = available[i]; } int finish[n]; for (int i = 0; i < n; i++) { finish[i] = 0; } bool found = true; int sequence[n]; int index = 0; while (found) { found = isSafe(work, need, allocation, n, work, finish); for (int i = 0; i < n; i++) { if (finish[i] == 1) { continue; } bool flag = true; for (int j = 0; j < 3; j++) { if (need[i][j] > work[j]) { flag = false; break; } } if (flag) { sequence[index++] = i; for (int j = 0; j < 3; j++) { work[j] += allocation[i][j]; } finish[i] = 1; } } } for (int i = 0; i < n; i++) { printf("%s ", (i == 0)? "" : " "); switch (sequence[i]) { case 0: printf("P0"); break; case 1: printf("P1"); break; case 2: printf("P2"); break; case 3: printf("P3"); break; } } } int main() { int resource[3]; scanf("%d %d %d", &resource[0], &resource[1], &resource[2]); int claim[4][3], allocation[4][3]; char processName[4][10]; for (int i = 0; i < 4; i++) { scanf("%s %d %d %d %d %d %d", processName[i], &claim[i][0], &claim[i][1], &claim[i][2], &allocation[i][0], &allocation[i][1], &allocation[i][2]); } if (bankerAlgorithm(resource, claim, allocation, 4)) { printSafeSequence(claim, allocation, 4); } else { printf("false"); } return 0; } ``` ######[AI写代码神器 | 1153点数解答 | 2024-11-14 16:47:16]
- 求解特定条件下整数序列的最小值:算法分析与代码实现(字节豆包 | 746点数解答 | 2026-01-24 13:14:40)74
- 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
- C++:轻松判断 int 型整数 32 位内码是否对称,附代码详解!(字节豆包 | 560点数解答 | 2026-01-23 19:44:43)48
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)354
- 求解整数序列操作最小次数:让前缀和之和等于后缀和之和(DeepSeek | 1329点数解答 | 2025-05-25 17:27:01)244
- C++求解:使整数序列前缀和之和等于后缀和之和的最小操作次数(DeepSeek | 532点数解答 | 2025-05-25 17:27:47)270
- 32位二进制IP地址转点分十进制:Python代码实现及示例(DeepSeek | 102点数解答 | 2026-01-20 13:53:38)62
- Python 实现移位与仿射密码:精准加密解密及关键逻辑解析(字节豆包 | 798点数解答 | 2024-12-18 15:55:47)282
- C++ 实现:快速判断正整数是否为“超级整数”(字节豆包 | 239点数解答 | 2025-11-10 18:52:28)112
- C++实现:判断正整数是否为“超级整数”(字节豆包 | 242点数解答 | 2025-11-10 20:27:49)161
- iOS开发揭秘:序列(Sequence)索引是否从0开始?实例为你解答!(百度文心 | 187点数解答 | 2023-11-09 17:44:38)260