我测试了machine,time数组的输出,machine没问题,time数组输有问题,比如题目给的输入,time输出会是1 1 1 1 2 4而不是3 2 2 5 2 4,而且当我删去插入部分的代码或者删去正常填充时间线的代码二选一时,又或者两个都删掉时,time的输出又恢复了正常,是为什么呢?
#include <iostream>
#include <cstdio>
#include<string.h>
using namespace std;
int main()
{
//machine是每个工件每个工序对应的机器。time则是每个工件每个工序对应的时间。result模拟时间线,最多20个零件,最多二十道工序每道工序最多20分钟,故最多400分钟。check用来记录do[i]出现次数。
int d,m,n,machine[20][20],time[20][20],do1[400],i,j,k,result[20][400]={0},check[20]={0},step=0,max,j1;
scanf("%d %d",&m,&n);
for(i=0;i<m*n;i++)
{
scanf("%d",&do1[i]);//do[i]为工件序号,同一个do1[i]第几次出现就是第几道工序
check[do1[i]]++; //那么此时此do1[i]对应的工序序号就在对应的check里了
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&machine[i][j]);//记录每个工件每个工序对应的机器
}
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&time[i][j]);//记录每个工件每个工序对应的时间
}
}
for(i=0;i<m*n;i++)
{
//只进行是否能插入的判断而不管时间重合,因为每次插入都是step到step+time,还会更新step,所以并不会出现时间重叠
int j2=0;
for(j=0;j<step;j++)
{
int num=0;
if(result[machine[do1[i]][check[do1[i]]]][j]==1)
{
j1=j;//记录起始位置
while(result[machine[do1[i]][check[do1[i]]]][j]==1)//因为现在判断的这道工序仅能由对应的机器进行操作,所以并不需要对每台机器都判断一遍,原先写的k循环判断每台机器删去
{
num++;
j++;
}
j--;
}
if(num>=time[do1[i]][check[do1[i]]])//如果这段空时间的长度大于了这个工件这道工序的加工时间,说明这里可插入
{
for(k=j1;k<j1+time[do1[i]][check[do1[i]]];k++)
{
result[machine[do1[i]][check[do1[i]]]][k]=1;//插入
}
j2=1;
max=k-1;
}
}
if(j2==1)
{
break;//判断下一道工序(下一个i)
}
for(j=step;j<step+time[do1[i]][check[do1[i]]];j++)//
{
result[machine[do1[i]][check[do1[i]]]][j]=1;//machine[do[i]][check[do[i]]]此时即为do1[i]所用机器。这里是把所用机器的时间线上的时间进行一个记录,0代表空着,1代表已使用
}
max=j-1;//记录时间
}
cout<<max;
return 0;
}