1. 程式人生 > 遊戲攻略 >《原神攻略》2.2版深淵法師全討伐點點陣圖示

《原神攻略》2.2版深淵法師全討伐點點陣圖示

銀行家演算法

題目
利用銀行家演算法寫一個系統安全性檢測程式(要求對關鍵步驟進行註釋),判定如下系統的安全性。已知系統有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;

}

執行截圖如下:

此次實驗有參考他人演算法,安全性的計算有點取巧