如有问题,望指正。
#include <stdio.h>
#include <cstring>
#include<iostream>
const int MAXN = 10005;
using namespace std;
int available[MAXN]; /*可用资源数组*/
int claim[MAXN][MAXN]; /*最大需求矩阵*/
int allocation[MAXN][MAXN]; /*表示Pi已占有的Rj类资源数量*/
int need[MAXN][MAXN]; /*需求矩阵*/
int request[MAXN][MAXN]; /*进程还需要资源数*/
bool finish[MAXN]; /*系统是否有足够的资源分配*/
int p[MAXN]; /*记录完成*/
int m,n; /*m个进程,n个资源*/
void inti(){
memset(finish,false,sizeof(finish));
printf("请输入进程数量:\n");
scanf("%d",&m);
printf("请输入资源数量:\n");
scanf("%d",&n);
printf("请输入进程最大需求矩阵:\n");
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
scanf("%d",&claim[i][j]);
}
}
printf("请输入进程已经占有的资源数量:\n");
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
scanf("%d",&allocation[i][j]);
need[i][j]=claim[i][j]-allocation[i][j];
if(need[i][j]<0){
printf("错误,请重新输入%d进程已经占有%d资源的数量\n",i,j);
j--;
}
}
}
printf("请输入可用的资源组:\n");
for(int j=1;j<=n;j++)
scanf("%d",&available[j]);
}
bool solve(){
bool flag;
for(int i=1;i<=m;i++){ //遍历每个进程
if(!finish[i]){
flag=true;
for(int j=1;j<=n;j++){
if(need[i][j]>available[j])
flag=false;
}
if(flag){
finish[i]=true;
printf("-->P%d \n",i);
printf("available: ");
for(int j=1;j<=n;j++){
available[j]+=allocation[i][j];
printf(" %d",available[j]);
}
printf("\n");
i=0;
}
}
}
flag=true;
for(int i=1;i<=m;i++){
if(!finish[i]){
flag=false;
break;
}
}
if(flag){
printf("系统安全\n");
return true;
}
else{
printf("系统危险\n");
return false;
}
}
void bank(){
int process;
while(1)
{
memset(finish,false,sizeof(finish));
printf("请输入要申请资源的进程号:\n");
scanf("%d",&process);
if(process==-1) break;
printf("请输入进程所请求的各资源的数量:\n");
for(int i=1; i<=n; i++)
{
scanf("%d",request[i]);
if(request[process][i]>need[process][i])
{
printf("您输入的%d资源请求数超过进程的需求量!请重新输入!\n",i);
i--;
}
if(request[process][i]>available[i])
{
printf("您输入的%d资源请求数超过系统有的资源数!请重新输入!\n",i);
i--;
}
}
for(int i=1; i<=n; i++)
{
available[i]-=request[process][i];
allocation[process][i]+=request[process][i];
need[process][i]-=request[process][i];
}
if(solve())
{
printf("同意分配请求!\n");
}
else
{
printf("您的请求被拒绝!\n");
for(int i=1; i<=n; i++)
{
available[i]+=request[process][i];
allocation[process][i]-=request[process][i];
need[process][i]+=request[process][i];
}
}
}
}
int main(){
inti();
solve();
bank();
}
/*
5
4
4 1 1 1
0 2 1 2
4 2 1 0
1 1 2 1
2 1 1 0
3 0 1 1
0 1 0 0
1 1 1 0
1 1 0 1
0 0 0 0
1 0 2 0
*/