火车三

作者在 2010-05-25 12:35:32 发布以下内容

非栈和队列
#include<iostream.h>
void Output(int NowOut, int Track, int& Last)
{ //将车厢NowOut 从缓冲铁轨移动到出轨,并修改Last
cout<< "Move car " << NowOut << " from holding track " << Track << " to output" << endl;
if (NowOut == Last) Last = 0;
}
bool Hold(int c, int last[], int track[], int k)
{ //把车厢c 移动到缓冲铁轨中
// 如果没有可用的缓冲铁轨,则返回f a l s e,否则返回t r u e
// 为车厢c 寻找最优的缓冲铁轨
// 初始化
int BestTrack = 0, // 目前最优的铁轨
BestLast = 0; // BestTr a c k中最后一节车厢
// 扫描缓冲铁轨
for(int i=1;i<=k;i++) // find best track
if (last[i]) {// 铁轨i 不为空
if (c>last[i]&&last[i]>BestLast) { // 铁轨i 尾部的车厢编号较大
BestLast=last[i];
BestTrack=i;}
}
else // 铁轨i 为空
if (!BestTrack) BestTrack = i;
if (!BestTrack) return false; // 没有可用的铁轨
// 把c 移动到最优铁轨
track[c] = BestTrack ;
last[BestTrack]=c;
cout<<"Move car "<<c<<"from input "<<"to holding track "<<BestTrack<<endl;
return true;
}
bool Railroad(int p[], int n, int k)
{// 用k 个缓冲铁轨进行车厢重排,车厢的初始次序为p [ 1 : n ]
// 如果重排成功,则返回t r u e,否则返回f a l s e
// 如果空间不足,则引发异常NoMem
// 对数组l a s t和t r a c k进行初始化
int *last=new int[k+1];
int *track=new int[n+1];
for (int i=1;i<=k;i++)
last[i]=0; // 铁轨i为空
for(i=1;i<=n;i++)
track[i]=0;
k--;
// 铁轨k 作为直接移动的通道
// 对欲输出的下一节车厢的编号置初值
int NowOut=1;
//按序输出车厢
for (i=0; i<n; i++)
if (p[i]==NowOut) {// 直接输出
cout<< "Move car "<<p[i]<<" from input to output"<<endl;
NowOut++;
// 从缓冲铁轨中输出
while (NowOut<=n&&track[NowOut])
{
Output(NowOut, track[NowOut], last[NowOut]);
NowOut++ ;
}
}
else {// 把车厢p[i] 移动到缓冲铁轨
if (!Hold(p[i], last, track, k))
return false;}
return true;
}
void main()
{
int p[9]={3,6,9,2,4,7,1,8,5},i=9,j=0;
cin>>j;
Railroad(p,i,j);

}

默认分类 | 阅读 689 次
文章评论,共0条
游客请输入验证码
文章分类