#include<stdio.h>
#include<stdlib.h>
#define true 1
#define false 0
int Available[10];
int Claim[10][10];
int Allocation[10][10];
int Need[10][10];
int Request[10][10];
char P[10];
int m,n,k;
void safe(){
int work[50],i,j,k,h=0;
char rest[10];
int flag=0;
int Finish[10];
for(i=0;i<n;i++)
work[i]=Available[i];
for(i=0;i<m;i++){
Finish[i]=false;
rest[i]=P[i];
}
for(i=0;i<m;i++){
if(Finish[i]==true) continue;
else{
for(j=0;j<n;j++)
if (Need[i][j]>work[j])
break;
if(j==n){
for(k=0;k<n;k++){
work[k]=work[k]+Allocation[i][k];
}
Finish[i]=true;
rest[h++]=P[i];
switch(i){
case 0: continue;
case 1:case 2:case 3:case 4: i=-1;
}
}
else continue;
}
}
if(h==m) flag=1;
if(flag==0)
printf("系统处于不安全\n");
else{
printf("系统处于安全\n");
for (i=0;i<h;i++)
{
printf("%c",rest[i]);
if (i!=h-1)
printf("-->");;
}
printf("\n");
}
}
void main(){
int i,j;
printf("请输入进程数\n");
scanf("%d",&m);
printf("请输入资源数\n");
scanf("%d",&n);
printf("请输入进程的种类\n");
getchar();
for(i=0;i<m;i++){
scanf("%c",&P[i]);
}
printf("请输入每类进程对各类资源的最大需求\n");
for(i=0;i<m;i++)
for(j=0;j<n;j++){
scanf("%d",&Claim[i][j]);
}
printf("请输入可用的资源数\n");
for(i=0;i<n;i++){
scanf("%d",&Available[i]);
}
printf("请输入每类进程对各类资源的占有数即给每类进程分配资源\n");
for(i=0;i<m;i++)
for(j=0;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--;
continue;
}
}
safe();
}