#include <stdio.h>
#include <stdlib.h>

#define M 3 // 资源数
#define N 4 // 进程数量

int Resource[M]; // 每个资源的总数
int Available[M]; // 每个资源的可用资源数
int MAX[N][M]; // 每个进程的最大资源需求
int Allocation[N][M]; // 每个进程已经分配的资源数
int Need[N][M]; // 每个进程还需要的资源数

void init_resources();
void check_init(int i, int Temp[M]);
int check_safety(int i);

void allocate_resources(int i);

int main(){
    init_resources(); // 初始化值
    return 0;
}

void init_resources() {
    int i, j;
    int v;
    printf("请输入%d个资源的总数:\n", M);
    for (j = 0; j < M; ++j) {
        scanf("%d", &Resource[j]);
        Available[j] = Resource[j];
    }

    printf("输入%d个进程需要的最大资源数:\n", N);
    for (i = 0; i < N; ++i) {
        for (j = 0; j < M; ++j) {
            scanf("%d", &MAX[i][j]);
        }
    }

    printf("输入%d个进程对%d个资源的已分配数:\n", N, M);
    for (i = 0; i < N; ++i) {
        printf("进程%d分配的%d类资源数:\n", i, M);
        for (j = 0; j < M; j++) {
            scanf("%d", &Allocation[i][j]);
            Need[i][j] = MAX[i][j] - Allocation[i][j];
            if (Need[i][j] < 0) {
                Need[i][j] = 0;
            }
            check_init(i, Allocation[i]);
        }
    }

    for (j = 0; j < M; j++) {
        for (i = 0; i < N; i++) {
            Available[j] -= Allocation[i][j];
        }
    }

    printf("初始化序列为:\n");
    printf("进程名称| 最大申请资源    |  已经申请资源   |  需要的资源   |  可用资源\n");
    for (i = 0; i < N; i++)
    {
        if (i == 0)
        {
            printf("进程p%d \t %2d %2d %2d \t %2d %2d %2d \t %2d %2d %2d \t %2d %2d %2d\n", i + 1, MAX[i][0], MAX[i][1],
                   MAX[i][2], Allocation[i][0], Allocation[i][1], Allocation[i][2], Need[i][0], Need[i][1], Need[i][2],
                   Available[0], Available[1], Available[2]);
        } else
        {
            printf("进程p%d \t %2d %2d %2d \t %2d %2d %2d \t %2d %2d %2d\n", i + 1, MAX[i][0], MAX[i][1], MAX[i][2],
                   Allocation[i][0], Allocation[i][1], Allocation[i][2], Need[i][0], Need[i][1], Need[i][2]);
        }
    }

    for (i = 0; i < N; i++) {
        if (check_safety(i) == M) {
            v = i ;
            allocate_resources(i);
        }
    }
    // 添加新的功能
    for (i = 0; i < v; i++) {
        // 内部循环 从匹配到的进程开始反过来遍历匹配
        if (check_safety(i) == M) {
            v = i ;
            allocate_resources(i);
        }
    }
}

void allocate_resources(int i) {
    printf("匹配到进程%d,准备分配资源\n", i);
// 分配资源
    for (int j = 0; j < M; j++) {
        Allocation[i][j] += Available[j];
        if (Allocation[i][j] >= MAX[i][j]) {
            Available[j] += Allocation[i][j];
        } else {
            printf("分配给进程%d后的资源仍然不满足此进程的最大值\n", i);
            break;
        }
    }
}



void check_init(int i, int Temp[M]) {
    int j;
    for (j = 0; j < M; ++j) {
        if (Temp[j] > MAX[i][j]){
            printf("输入错误:进程%d, 资源类别%d的已分配资源大于最大资源需求\n", i, j + 1);
            exit(1);
        } else if (Temp[j] > Resource[j]){
            printf("输入错误:进程%d的已分配资源大于总可用资源\n", i);
            exit(2);
        } else if (MAX[i][j] > Resource[j]){
            printf("输入错误:进程%d的最大资源需求大于总资源数\n", i);
            exit(3);
        }
    }
}

int check_safety(int i) {
    for(int j = 0; j < M; j++) {
        if (Need[i][j] > Available[j]) {
            return 0; // 该进程不能分配资源
        }
    }
    return M; // 该进程可以分配资源
}