📄 rail3.cpp
字号:
// railroad car rearrangement with LIFO holding tracks
// no explicit queues used
#include <iostream.h>
#include "xcept.h"
void Output(int NowOut, int Track, int& Last)
{// Move car NowOut from hold to output and update 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)
{// Add car c to a holding track.
// Return false if no feasible holding track.
// Return true otherwise.
// find best holding track for car c
// initialize
int BestTrack = 0, // best track so far
BestLast = 0; // last car in BestTrack
// scan holding tracks
for (int i = 1; i <= k; i++) // find best track
if (last[i]) {// track i not empty
if (c > last[i] && last[i] > BestLast) {
// track i has bigger car at end
BestLast = last[i];
BestTrack = i;}
}
else // track i empty
if (!BestTrack) BestTrack = i;
if (!BestTrack) return false; // no track available
// add c to best track
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 track rearrangement of car order p[1:n].
// Return true if successful, false if impossible.
// Throw NoMem exception if inadequate space.
// initialize arrays last and track
int *last = new int [k + 1];
int *track = new int [n + 1];
for (int i = 1; i <= k; i++)
last[i] = 0; // track i is empty
for (int i = 1; i <= n; i++)
track[i] = 0; // car i is on no track
k--; // keep track k open for direct moves
// initialize index of next car
// that goes to output
int NowOut = 1;
// output cars in order
for (int i = 1; i <= n; i++)
if (p[i] == NowOut) {// send straight to output
cout << "Move car " << p[i] <<
" from input to output" << endl;
NowOut++;
// output from holding tracks
while (NowOut <= n && track[NowOut]) {
Output(NowOut, track[NowOut], last[NowOut]);
NowOut++;
}
}
else {// put car p[i] in a holding track
if (!Hold(p[i], last, track, k))
return false;}
return true;
}
void main(void)
{
// int p[10] = {0, 5, 8, 1, 7, 4, 2, 9, 6, 3};
int p[10] = {0, 3, 6, 9, 2, 4, 7, 1, 8, 5};
cout << "Input permutation is 0369247185" << endl;
Railroad(p,9,3);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -