1、6.6 布线问题算法设计思想:采用分支限界法求解。首先将问题转化为一颗解空间树:树根为线头,树高为线头到线尾的格数,每个节点有 4 个孩子,代表下一格可以朝 4 个方向。这样,布线问题就是搜索从树根到代表线尾节点的一条最短路径。分支限界法的本质是对解空间树的 BFS(广度优先)搜索,即每进一格就将状态入队,而后再依次将出队的每个状态的子状态入队,直到到达所求的状态节点即线尾。该问题的剪枝条件显而易见,即当遇到电路板上的封锁标记时进行剪枝。为了方便剪枝,算法开始进行了预处理,在电路板周围加上了一圈“围墙” (虚拟的封锁标记) ,使搜索路径时对边界的处理与对封锁标记的处理统一。因为该问题 BFS
2、的队列中,并没有明显的优先级,所以该算法采用普通队列式。除了上述三点之外,程序对鲁棒性做了增强,对非法输入和文件错误进行了检测。程序设计代码: /*头文件 布线问题.h*/#ifndef KNAP_H#define KNAP_H#include #include #include using namespace std;class position /位置类public:int row; /行坐标int column; /列坐标bool operator=(const position elsereturn false;positionthis-column = b.column;return
3、 *this;position operator+(const position temp.row = row + b.row;temp.column = column + b.column;return temp;class Wiring /布线类public:Wiring(char *in, char *out); /构造函数Wiring(); /析构函数void Solve(); /输出结果到文件protected:bool FindPath(); /找出布线方案void PrintPath(); /输出结果布线方案void PrintFail(); /输出没有路径信息private:i
4、nt n, m; /电路板行列数int *grid; /电路板格子position start, finish; /起点和终点position *nextstep; /下一步四个方向ofstream fout; /输出结果文件;#endif/*函数实现文件 布线问题.cpp*/#include “布线问题.h“Wiring:Wiring(char *in, char *out) : fout(out)ifstream fin(in);if( !fin )cerr n m; /初始化电路板大小 n*mgrid = new int*n+2;for(int i = 0; i gridij;fin s
5、tart.row start.column; /初始化起点和终点fin finish.row finish.column;fin.close();nextstep = new position4;nextstep0.row = 0; nextstep0.column = 1; /右nextstep1.row = 1; nextstep1.column = 0; /下nextstep2.row = 0; nextstep2.column = -1; /左nextstep3.row = -1; nextstep3.column = 0; /上if( !fout )cerr Queue; /辅助队列
6、Queue.push_back(start); /初始位置是起点while(1)here = Queue.front(); /取队尾位置Queue.pop_front();for(int i = 0; i 0; i-) /找前趋位置gridhere.rowhere.column = -1; /表示在路径上for(int j = 0; j 4; j+)near = here + nextstepj;if(gridnear.rownear.column = i+1) /找到前趋break;here = near; /向前移动for(int i = 1; i = n; i+)int j;for(j = 1; j = m; j+)if(gridij = -1) /表示路径fout “*tt“;elsefout gridij “tt“;fout endl;void Wiring:PrintFail()fout “No Path!“ endl;/*主函数文件 test.cpp*/#include “布线问题.h“int main()char *in = “input.txt“; /输入文件char *out = “output.txt“; /输出文件Wiring wiring(in, out); /文件初始化线路板wiring.Solve(); /求解布线问题return 0;