//15.1装配线调度问题
#include <iostream>
using namespace std;
#define I 2
#define J 6
int a[I+1][J+1],e[I+1],x[I+1],t[I+1][J+1],n=J;
int f[I+1][J+1],l[I+1][J+1],rf,rl;
void Input()//输入
{
int i,j;
for(i=1;i<=I;++i)
{
for(j=1;j<=J;++j)
{
cout<<"Please input a["<<i<<"]"<<"["<<j<<"]";
cin>>a[i][j];
cout<<endl;
}
}
for(i=1;i<=I;++i)
{
cout<<"Please input e["<<i<<"]";
cin>>e[i];
cout<<endl;
}
for(i=1;i<=I;++i)
{
cout<<"Please input x["<<i<<"]";
cin>>x[i];
cout<<endl;
}
for(i=1;i<=I;++i)
{
for(j=1;j<J;++j)
{
cout<<"Please input t["<<i<<"]"<<"["<<j<<"]";
cin>>t[i][j];
cout<<endl;
}
}
}
void fastest_way()//求装配线的最快路径
{
int j;
f[1][1]=e[1]+a[1][1];
f[2][1]=e[2]+a[2][1];
for(j=2;j<=n;++j)
{
//求到达f[1][j]的最快路线
if(f[1][j-1]+a[1][j]<=f[2][j-1]+t[2][j-1]+a[1][j])
{
f[1][j]=f[1][j-1]+a[1][j];
l[1][j]=1;
}
else
{
f[1][j]=f[2][j-1]+t[2][j-1]+a[1][j];
l[1][j]=2;
}
//求到达f[1][j]的最快路线
if(f[2][j-1]+a[2][j]<=f[1][j-1]+t[1][j-1]+a[2][j])
{
f[2][j]=f[2][j-1]+a[2][j];
l[2][j]=2;
}
else
{
f[2][j]=f[1][j-1]+t[1][j-1]+a[2][j];
l[2][j]=1;
}
}
//最终的最快路线的结果
if(f[1][n]+x[1]<=f[2][n]+x[2])
{
rf=f[1][n]+x[1];
rl=1;
}
else
{
rf=f[2][n]+x[2];
rl=2;
}
}
void Print_Stations()
{
cout<<"输出装配路线"<<endl;
int i=rl,j;//i表示最后是从哪条装配路线到达出口的
//倒序输出
cout<<"line "<<i<<" station "<<n<<endl;
for(j=n;j>1;j--)
{
i=l[i][j];
cout<<"line "<<i<<" station "<<j-1<<endl;
}
}
void Print_Stations2(int i, int j)
{
if(j != n)
i = l[i][j+1];
//先输出前面的
if(j > 1)
Print_Stations2(i, j-1);
//再输出当前的
cout<<"line "<<i<<" station "<<j<<endl;
}
void Output()
{
int i, j;
cout<<"输出f[i][j]"<<endl;
//f[i][j]表示一个底盘从起点开始到装配站s[i][j]的最快可能时间
for(i = 1; i <= I; i++)
{
for(j = 1; j <= J; j++)
cout<<f[i][j]<<' ';
cout<<endl;
}
cout<<"输出l[i][j]"<<endl;
//l[i][j]表示使得f[i][j]最小时在哪个装配线上装配j-1
for(i = 2; i <= I; i++)
{
for(j = 1; j <= J; j++)
cout<<l[i][j]<<' ';
cout<<endl;
}
}
int main()
{
Input();
fastest_way();
Output();
Print_Stations();
cout<<"顺序输出装配路线"<<endl;
Print_Stations2(rl, J);
return 0;
}