《原神攻略》2.2版深淵法師全討伐點點陣圖示
阿新 • • 發佈:2021-11-11
銀行家演算法
題目
利用銀行家演算法寫一個系統安全性檢測程式(要求對關鍵步驟進行註釋),判定如下系統的安全性。已知系統有5個程序P0、P1、P2、P3、P4,三類資源A、B、C,當前時刻可用資源向量a=(0,0,0),各程序對資源的需求和佔用情況如表所示,請問此時系統是否處於安全狀態?
表1 程序需求資源情況表
程式碼如下:
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define RE 100 int flag_need = 1;//標誌程序請求資源數量是否出錯 int row,col; int Max[RE][RE],Allocation[RE][RE],Need[RE][RE],finish[RE] = {0},Available[RE],Work[RE],P[RE];//定義最大需求矩陣、已獲得資源矩陣等 void init(){ //初始化 printf("輸入程序數:\n"); scanf("%d",&row); printf("輸入資源數:\n"); scanf("%d",&col); printf("輸入每個程序最多需要的資源數按照%d x %d矩陣輸入:\n",row,col);//最大需求矩陣儲存在MAX[i][j]中 int i,j; for(i = 0;i < row;i ++){ for(j = 0;j < col;j ++){ scanf("%d",&Max[i][j]); } } printf("輸入每個程序已經分配的資源數按照%d x %d矩陣輸入:\n",row,col);//已分配資源矩陣ALLOCATION[i][j] for(i = 0;i < row;i ++){ for(j = 0;j < col;j ++){ scanf("%d",&Allocation[i][j]); Need[i][j] = Max[i][j]-Allocation[i][j]; //max=allocation+need if(Need[i][j] < 0){ //程序所請求的資源不可能為負數 printf("程序P%d的R%d資源出錯\n"); flag_need = 0; } } } printf("請輸入現有各資源數:\n");//現有資源:一個一維向量 availabe for(i = 0;i < col;i ++){ scanf("%d",&Available[i]); Work[i] = Available[i]; } } void print(bool x){//列印安全序列或者說明不安全 int k; if(x){ printf("系統是安全的\n安全序列為:"); for(k = 0;k < row - 1;k ++){ printf("%d ->",P[k]); } printf("%d\n",P[k]); } else printf("系統不安全\n"); } bool isSafe(){ //判斷系統是否安全 int k = 0,len = 0,lastlen = 0; int i,j; while(len < row){ //依次對系統中的程序進行判斷 for(i = 0;i < row;i ++){//對一個程序中的每個資源請求進行判斷 if(finish[i] != 1){//該程序仍需要申請資源 k = 0; for (j = 0;j < col;j ++){ if (Need[i][j] <= Work[j]) //當前程序中的每一個資源是否對應能被滿足 k ++; } if (k == col) {//滿足訪問所有需求 finish[i] = 1; P[len] = i;//放程序安全序列 for(j = 0;j < col;j ++){ Work[j] += Allocation[i][j]; } len ++; //統計程序個數 break; } } } /*len 控制對每個程序的訪問,len=row,證明所有程序都被訪問完畢,存在一個安全序列 finish[i] k控制對程序對需求每一個資源的訪問 */ //上一次迴圈長度與下一次相等,則出現不安全情況,程序未被完全訪問 if (lastlen == len){//如果程序訪問資源滿足不了需求,即Len不會+1,導致Len值不會修改,因此lastlen=len,從而說明系統不安全 break; }else{ lastlen = len; } } if(len == row){ return true; } else { return false; } } int main (){ init(); print(isSafe()); return 0; }
執行截圖如下:
此次實驗有參考他人演算法,安全性的計算有點取巧