#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;
}
#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;
}