算法导论15.1 装配线调度问题

//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;  
}  


		




			

点赞