不知道为啥4-10一直错
查看原帖
不知道为啥4-10一直错
1446842
protoss11楼主2024/10/11 23:55
#include <iostream>
using namespace std;

void initialize(int& m, int& n,int choiceMachine[],int time[],int inOrder[]) {
    cin >> m >> n;
    for (int i = 0; i < n * m; i++) {
        cin >> inOrder[i];
    }
    for (int i = 0; i < m*n; i=i+m) {
        for(int j=0;j<m;j++)
            cin>>choiceMachine[i+j];
    }
    for (int i = 0; i < m*n; i=i+m) {
        for (int j = 0; j < m; j++)
            cin >> time[i + j];
    }
    return;
}

bool finishWork(int m,int n,int order[],int machine_status[],int user[]) {
//返回为true则所有工作已经完成
    bool f1 = true;
    bool f2 = true;
    bool f3 = true;
    for (int i = 0; i < 10000;i++) {
        if (order[i] != 0) {
            f1 = false;
            break;
        }
    }
    for (int i = 0; i < 10000; i++) {
        if (machine_status[i] != 0) {
            f2 = false;
        }
    }
    for (int i = 0; i < 10000; i++) {
        if (user[i] != 0) {
            f3 = false;
        }
    }
    if (f1 && f2 && f3)
        return true;
    else
        return false;
}

void run(int& m, int& n,int choiceMachine[], int time[], int inOrder[]) {
    int machine[10000] = { 0 };//记录对应机器加工的工件
    int use[10000] = {0};//记录正在加工的工件,1为正在加工0为加工结束
    int machine_status[10000] = { 0 }; //记录机器状态0即空闲1即占用
    int totaltime = 0;
    int workTime[10000] = { 0 };
    for (int i = 0; i < m * n; i++) {           //遍历inOrder顺序
        if (inOrder[i] != 0 && use[inOrder[i]-1]==0) {    //该步未完成且该工件未占用
            for (int j = (inOrder[i] - 1) * m; j < inOrder[i] * m; j++) {
                if (choiceMachine[j] != 0) {
                    
                    if (machine_status[choiceMachine[j]-1] == 0) {//该机器空闲
//cout << "工件号:" << inOrder[i] << ",工序:" << j - (inOrder[i] - 1) * m + 1 << ",工作机器:" << choiceMachine[j] <<",用时:"<<time[j] <<",当前时间:"<<totaltime << endl;
                        use[inOrder[i]-1] = 1;//记录该工件为加工状态
                        machine[choiceMachine[j] - 1] = inOrder[i];
                        inOrder[i] = 0;//标记该步已完成
                        machine_status[choiceMachine[j]-1] = 1;//标记该机器正在使用
                        workTime[choiceMachine[j]-1] = time[j];//记录使用时长
                        choiceMachine[j] = 0;//预先标记已经完成该工序
                        break;//直接执行下一个
                    }
                    else {
                        break;//若该机器非空闲则直接下一个
                    }
                }
            }
        }


        if (i == m * n - 1) {//为0从头开始且各机器工序计数器减一且总时长加一
            cout << endl;
            totaltime++;
            i = 0;
            for (int j = 0; j < m * n; j++) {
                if (workTime[j] != 0) {
                    workTime[j]--;
                    if (workTime[j] == 0) {
                        machine_status[j] = 0;//加工完成恢复空闲
                        use[machine[j]-1] = 0;
                        machine[j] = 0;
                    }
                }
            }
        }
        if (finishWork(m, n, inOrder, machine_status,use) == true)//完成工作则退出循环
            break;
    }
    cout << totaltime;
    return;
}

int main() {
    int m = 0;
    int n = 0;
    int inOrder[10000] = { 0 };  //order为0即该顺序位的工作已完成
    int choiceMachine[10000] = { 0 };//记录各个工序选择的机器0即已完成
    int time[10000] = { 0 };     //时间为0即已完成
    int target = 0; 
    initialize(m, n, choiceMachine, time, inOrder);
    run(m, n, choiceMachine, time, inOrder);
    return 0;
}
```不知道为啥QAQ
2024/10/11 23:55
加载中...