#include <iostream>
using namespace std;
#define N 5 //进程个数
#define M 4 //资源种类数
//银行家算法
int Allocation[N][M]={3,0,1,1,0,1,0,0,1,1,1,0,1,1,0,1,0,0,0,0};
int Max[N][M] ={4,1,1,1,0,2,1,2,4,2,1,0,1,1,1,1,2,1,1,0};
int Total[M] ={6,3,4,2};//已知的三种向量
int Work[M];
int Need[N][M];
int Available[M];
bool Finish[N];
void Initialize()
{
int i,j;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
Need[i][j]=Max[i][j]-Allocation[i][j];
for(i=0;i<M;i++)
Available[i]=Total[i];
for(i=0;i<N;i++)
for(j=0;j<M;j++)
Available[j]=Available[j]-Allocation[i][j];
for(i=0;i<M;i++)
Work[i]=Available[i];
for(i=0;i<N;i++)
Finish[i]=false;
}
bool Issafe(int safe[])//判断一个序列是否安全
{
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
if(Need[ safe[i]][j] >Work[j] )
return false;
for(int xx=0;xx<M;xx++)
Work[xx]+=Allocation[safe[i]][xx];
}
return true;
}
int count=0;
void bank(int safe[],int k,int n)//类似全排列算法perm()
{
int i;
if(k+1==n)
{
Initialize();
if(Issafe(safe))
{
count++;
for(i=0;i<n;i++)
{
cout<<"p"<<safe[i]+1;
if(i!=n-1)
cout<<" - ";
}
cout<<endl;
}
}
else
{
for(i=k;i<n;i++)
{
swap(safe[i],safe[k]);
bank(safe,k+1,n);
swap(safe[i],safe[k]);
}
}
}
int main()
{
int s[N];//用于存放安全序列的
for(int i=0;i<N;i++)
s[i]=i;
cout<<"此时系统存在安全序列:"<<endl;
bank(s,0,N);
cout<<"所有可能的序列共有:"<<count<<"条"<<endl;
if(count==0)
cout<<"以上结论作废"<<endl<<"因为找到0条也就对应找不到安全序列";
return 0;
}
运行:
此时系统存在安全序列:
p4 - p1 - p3 - p2 - p5
p4 - p1 - p3 - p5 - p2
p4 - p1 - p2 - p3 - p5
p4 - p1 - p2 - p5 - p3
p4 - p1 - p5 - p2 - p3
p4 - p1 - p5 - p3 - p2
p4 - p5 - p1 - p3 - p2
p4 - p5 - p1 - p2 - p3
所有可能的序列共有:8条
--------------------------------
Process exited with return value 0
Press any key to continue . . .