您的位置:首页 > 其它

电路布线问题

2017-10-17 17:55 274 查看
#include <iostream>

#include <queue>

using namespace std;

#define M 10

#define N 10

typedef struct{

int row,col;

}Position;

int grid[M+2][N+2];

int Pathlen;

Position * path;

bool findPath(Position start,Position finish){

if(start.row==finish.row && finish.col == finish.col) {Pathlen = 0; return true;}

for(int i=0;i<N+2;i++){

grid[0][i] = grid[M+1][i] = -2; //围墙

}

for(int i=0;i<M+2;i++){

grid[i][0] = grid[i][N+1] = -2;

}

for(int i=1;i<M+1;i++){

for(int j=1;j<N+1;j++){

grid[i][j]=-1;

}

}

//初始化四个方向的相对位置

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;

Position here,nbr;

here.row=start.row;here.col=start.col;

grid[start.row][start.col]=0; //初始位置为0

queue<Position> Q;

do{

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]==-1){grid[nbr.row][nbr.col]=grid[here.row][here.col]+1;}

if(nbr.row==finish.row && nbr.col==finish.col) break;

Q.push(nbr);

}

if(nbr.row==finish.row && nbr.col==finish.col) break;

if(Q.empty()) return false; //拓展节点用完但还未到终点,无解

here = Q.front();

Q.pop();

}while(true);

//逆向构造最短布线方案

Pathlen = grid[finish.row][finish.col];

path = new Position[Pathlen];

here = finish;

for(int j=Pathlen-1;j>=0;j--){

path[j]=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]==j) break;

}

here = nbr;

}

return true;

}

int main()

{

Position start,finish;

cout<<"########### Tips: 最大行列数为"<<M<<" ############"<<endl;

cout<<"起点(行,列):";

cin>>start.row>>start.col;

cout<<"终点(行,列):";

cin>>finish.row>>finish.col;

if(findPath(start,finish)==true){

cout<<"电路布线路径如下:"<<endl;

cout<<start.row<<","<<start.col<<endl;

for(int i=0;i<Pathlen;i++){

cout<<path[i].row<<","<<path[i].col<<endl;

}

}else{cout<<"没有路径!"<<endl;}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息