import java.util.Scanner;
public class test {
Scanner in=new Scanner(System.in);
int[][] Max; //最大
int[][] Allocation; //已分配
int[][] Need; //需要
int[] Availables; //每个进程完成后存在的可分配的
int[] Available; //现有
int[] Allocations;
int p; //定义进程数
int z; //定义资源数
int[] safe; //定义安全序列数组
int[] Max1;
int[] request; //请求资源数
int p2=0; //请求进程的下标
int request1=0; //请求数字
int[] Need1; //获取need数组中的每行的值
int ava=0; //获取available数值
int available=0;
public static void main(String[] args) {
test tests=new test();
tests.definition();
}
public void definition(){
/*定义数组和相关变量*/
System.out.println("请输入进程数:");
p=in.nextInt(); //输入进程
System.out.println("请输入资源数:");
z=in.nextInt(); //输入资源
Max=new int[p][z];
Allocation=new int[p][z];
Need=new int[p][z];
Availables=new int[p];
Available=new int[z];
safe=new int[p];
Need1=new int[p];
request=new int[z];
Max1=new int[p];
Allocations=new int[p];
for (int i=0;i<p;i++) { //存储输入数据
System.out.println("请输入p"+i+"的Max:");
for (int j=0;j<z;j++){
Max[i][j]=in.nextInt(); //输入max,并存入数组
}
System.out.println("请输入p"+i+"的Allocation:");
for (int j=0;j<z;j++){
Allocation[i][j]=in.nextInt(); //输入Allocation,并存入数组
}
System.out.println("请输入p"+i+"的Need:");
for (int j=0;j<z;j++){
Need[i][j]=in.nextInt(); //输入Need,并存入数组
}
if (i==0){
System.out.println("请输入Available:");
for (int j=0;j<z;j++){
Available[j]=in.nextInt(); //输入Available,并存入数组
}
}
}
if (compare()==0){
System.out.println("不存在安全序列");
}
else{
System.out.println("存在安全序列,安全序列为:");
for (int i=0;i<p;i++){
System.out.print("p"+safe[i]+" ");
}
}
/*判断是否安全*/
if (check()==0){
System.out.println("无法进行分配");
}
else{
if(safe()==0){
System.out.println("申请自愿不安全");
}
else{
for(int i=0;i<p;i++){
System.out.print("p"+safe[i]+" ");
}
}
}
}
public int compare(){
System.out.println("aaa");
for (int i=0;i<p;i++){
Need1[i]=0;
}
for (int i=0;i<p;i++){ //获取Need数值
for (int j=0;j<z;j++){
Need1[i]=Need1[i]+Need[i][j]*(int)Math.pow(10,(z-1-j));
}
}
int[] Need2=new int[p]; //获取值,进行排序,然后和原序列比较
for (int i=0;i<p;i++){
Need2[i]=Need1[i];
}
int need; //中间值
for (int i=0;i<p-1;i++){ //获取到need的升序排列
for (int j=i+1;j<p;j++){
if (Need2[i]>Need2[j]){
need=Need2[i];
Need2[i]=Need2[j];
Need2[j]=need;
}
}
}
for (int i=0;i<p;i++){
Max1[i]=0;
}
for (int i=0;i<p;i++){
{
for (int j=0;j<z;j++){
Max1[i]=Max1[i]+Max[i][j]*(int)Math.pow(10,z-1-j);
}
}
}
for (int i=0;i<z;i++){
available=available+Available[i]*(int)Math.pow(10,(z-1-i));
}
if (Need2[0]>available){
return 0;
}
else{
for (int i=0;i<p;i++){
for (int j=0;j<p;j++){
if (Need2[i]==Need1[j]){
safe[i]=j;
}
}
}
for (int i=0;i<p;i++){
if (i==0){
Availables[i]=Max1[safe[i]]+available;
}
else{
Availables[i]=Max1[safe[i]]+Availables[i-1];
}
}
for (int i=0;i<p-1;i++){
if (Availables[i]<Need1[safe[i+1]]){
return 0;
}
}
return 1;
}
}
public int check(){
System.out.println();
System.out.println("请输入进程进程以及请求资源:");
System.out.println("进程(如p0):");
String p1=in.next();
System.out.println("request:");
for (int i=0;i<z;i++){
request[i]=in.nextInt(); //请求资源数
}
p1=p1.trim(); //对输入的信息过滤前后空格
p2=(int)p1.charAt(1)-48;
System.out.println(p2);
for (int i=0;i<z;i++){
request1=request1+request[i]*(int)Math.pow(10,z-1-i);
}
if (request1<=Need1[p2]){
if (safe[0]==p2){
for (int i=0;i<z;i++){
ava=ava+Available[i]*(int)Math.pow(10,z-1-i);
}
if (request1<=ava){
return 1;
}
else{
return 0;
}
}
else{
for (int i=1;i<p;i++){
if (safe[i]==p2){
if (request1<=Availables[i-1]){
return 1;
}
else {
return 0;
}
}
}
}
}
return 0;
}
public int safe(){
available=available-request1;
Need1[p2]=Need1[p2]-request1;
Allocations[p2]=Allocations[p2]+request1;
/*比 较*/
int[] Need2=new int[p]; //获取值,进行排序,然后和原序列比较
for (int i=0;i<p;i++){
Need2[i]=Need1[i];
}
int need; //中间值
for (int i=0;i<p-1;i++){ //获取到need的升序排列
for (int j=i+1;j<p;j++){
if (Need2[i]>Need2[j]){
need=Need2[i];
Need2[i]=Need2[j];
Need2[j]=need;
}
}
}
if (Need2[0]>available){
return 0;
}
else{
for (int i=0;i<p;i++){
for (int j=0;j<p;j++){
if (Need2[i]==Need1[j]){
safe[i]=j;
}
}
}
for (int i=0;i<p;i++){
if (i==0){
Availables[i]=Max1[safe[i]]+available;
}
else{
Availables[i]=Max1[safe[i]]+Availables[i-1];
}
}
for (int i=0;i<p-1;i++){
if (Availables[i]<Need1[safe[i+1]]){
return 0;
}
}
return 1;
}
}
}
可能存在某些bug,望指正