📄 wire.cpp
字号:
// Lee's wire router
#include <iostream.h>
#include <stdlib.h>
#include "lqueue.h"
#include "make2db.h"
class Position {
friend void InputGrid(Position&, Position&);
friend void OutputPath(int, Position *);
friend bool FindPath(Position, Position,
int&, Position * &);
private:
int row, col;
};
int **grid, m;
void InputGrid(Position &start, Position &finish)
{
cout << "Enter grid size" << endl;
cin >> m;
cout << "Enter start" << endl;
cin >> start.row >> start.col;
cout << "Enter finish" << endl;
cin >> finish.row >> finish.col;
Make2DArray(grid, m+2, m+2);
cout << "Enter wiring grid" << endl;
for (int i=1; i<=m; i++)
for (int j=1; j<=m; j++) cin >> grid[i][j];
}
bool FindPath(Position start, Position finish,
int& PathLen, Position * &path)
{// Find a path from start to finish.
// Return true if successful, false if impossible.
// Throw NoMem exception if inadequate space.
if ((start.row == finish.row) &&
(start.col == finish.col))
{PathLen = 0; return true;} // start = finish
// initialize wall of blocks around grid
for (int i = 0; i <= m+1; i++) {
grid[0][i] = grid[m+1][i] = 1; // bottom & top
grid[i][0] = grid[i][m+1] = 1; // left & right
}
// initialize offsets
Position offset[4];
offset[0].row = 0; offset[0].col = 1; // right
offset[1].row = 1; offset[1].col = 0; // down
offset[2].row = 0; offset[2].col = -1; // left
offset[3].row = -1; offset[3].col = 0; // up
int NumOfNbrs = 4; // neighbors of a grid position
Position here, nbr;
here.row = start.row;
here.col = start.col;
grid[start.row][start.col] = 2; // block
// label reachable grid positions
LinkedQueue<Position> Q;
do {// label neighbors of here
for (int i = 0; i < NumOfNbrs; i++) {
nbr.row = here.row + offset[i].row;
nbr.col = here.col + offset[i].col;
if (grid[nbr.row][nbr.col] == 0) {
// unlabeled nbr, label it
grid[nbr.row][nbr.col]
= grid[here.row][here.col] + 1;
if ((nbr.row == finish.row) &&
(nbr.col == finish.col)) break; // done
Q.Add(nbr);} // end of if
} // end of for
// have we reached finish?
if ((nbr.row == finish.row) &&
(nbr.col == finish.col)) break; // done
// finish not reached, can we move to a nbr?
if (Q.IsEmpty()) return false; // no path
Q.Delete(here); // get next position
} while(true);
// construct path
PathLen = grid[finish.row][finish.col] - 2;
path = new Position [PathLen];
// trace backwards from finish
here = finish;
for (int j = PathLen-1; j >= 0; j--) {
path[j] = here;
// find predecessor position
for (int i = 0; i < NumOfNbrs; i++) {
nbr.row = here.row + offset[i].row;
nbr.col = here.col + offset[i].col;
if (grid[nbr.row][nbr.col] == j+2) break;
}
here = nbr; // move to predecessor
}
return true;
}
void OutputPath(int PathLen, Position *path)
{// Output wire path.
cout << "The wire path is" << endl;
for (int i=0; i < PathLen; i++)
cout << (path[i]).row << (path[i]).col << endl;
}
void main(void)
{
Position s,f, *p;
int l;
InputGrid(s,f);
if (FindPath(s,f,l,p)) OutputPath(l,p);
else cout << "No path" << endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -