银行家算法是一个老问题了,这次课设又出现了,看了看网上动辄200+行,一堆东西感到害怕。。。所以自己写了个简单的供大家参考。。。请不要直接ctrl+C,我课设还想及格……至于实现,代码的注释已经非常清晰了。就是我省略了一个目前还需要矩阵的输入(感觉没必要)。
上代码咯
/**银行家算法C++实现,2018.6.27 writer:水题小王子 **/ #include #include using namespace std; int all[15][15]; ///总所需矩阵 int allneed[15][15]; ///已分配矩阵 int need[15][15]; ///还需要矩阵 int source[15]; int m,n; int available[15]; ///可用资源 int sum[15]; const int MAX=10000000; int main() { printf("请依次输入进程数量和资源种类:"); while(scanf("%d%d",&m,&n)==2) { printf("请依次输入各类资源总数:"); for(int i=1; i<=n; i++) scanf("%d",&source[i]); printf("总所需矩阵:"); for(int i=1; i<=m; i++) for(int j=1; j<=n; j++) scanf("%d",&all[i][j]); printf("已分配矩阵:"); for(int i=1; i<=m; i++) for(int j=1; j<=n; j++) scanf("%d",&allneed[i][j]); for(int i=1; i<=m; i++) for(int j=1; j<=n; j++) need[i][j]=all[i][j]-allneed[i][j]; for(int i=1; i<=n; i++) available[i]=source[i]; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) available[i]=available[i]-allneed[j][i];///计算可用小矩阵 int g=0; for(int kk=1; kk<=m; kk++) ///一共只需要跑m次 { for(int i=1; i<=m; i++) ///每一次找一个安全的行 { int flag=1; for(int j=1; j<=n; j++) { if(available[j]<need[i][j]) flag=0; } if(flag) ///找到了 { sum[g++]=i; // printf("i=%d \n ",i); for(int k=1; k<=n; k++) { available[k]=available[k]+allneed[i][k]; need[i][k]=MAX; // printf("%d ",available[k]); } // printf("\n"); break; } } } int the_right=1; for(int i=1; i<=m; i++) { if(need[m][1]!=MAX) { printf("无安全序列\n"); the_right=0; printf("\n\n请依次输入进程数量和资源种类:"); break; } } if(the_right) { printf("找到其中一个安全序列如下\n"); for(int i=0; i<g-1; i++) printf("%d -> ",sum[i]); cout<<sum[g-1]<<endl; printf("\n\n请依次输入进程数量和资源种类:"); } } return 0; }