布线问题其实可以看成是二维矩阵的赋值问题
将整个棋盘当作一个二维数组,起始点位置的值赋为2,障碍点的值赋为1,其他的点的初值为0
然后就开始执行操作,从起始点出发,每到一个点开始判断是否满足“未遍历过该点”和“该点不是障碍点”的条件,如果满足条件就给该点赋值为距离起始点的位置的步数加2的值,得到到达目标点的步数
最后再由数组的值返回后推出路径信息,以下是详细代码(路障的值,我在代码中简单设了以下,不同的棋盘可能有所不同)
#include"math.h"
#include<iostream>
#include<math.h>
using namespace std;
#include<math.h>
using namespace std;
class Position
{
friend bool FindPath(Position start,Position finish,int &Pathlen, Position * &path);
public:
Position(int x=0,int y=0)
{
this->x=x;
this->y=y;
}
private:
int x;
int y;
};
bool FindPath(Position start,Position finish,int &Pathlen, Position * &path)
{
if((start.x==finish.x)&&(start.y=finish.y))
{
Pathlen=0;
return 1;
}
int i,j,grid[9][9];
for(i=0;i<9;i++)
for(j=0;j<9;j++)
grid[i][j]=0;
for(i=0;i<=8;i++)
grid[0][i]=grid[8][i]=1;
for(i=0;i<=8;i++)
grid[i][0]=grid[i][8]=1;
grid[1][3]=1;grid[2][3]=1;grid[2][4]=1;grid[3][5]=1;grid[4][4]=1;grid[4][5]=1;grid[7][3]=1;
grid[5][1]=1;grid[5][5]=1;grid[6][1]=1;grid[6][2]=1;grid[6][3]=1;grid[7][1]=1;grid[7][2]=1;
Position offset[4]; //offset是四个移动方向的相对位移矩阵
offset[0].x = 0; offset[0].y = 1; // 右
offset[1].x = 1; offset[2].y = 0;//下
offset[2].x = 0; offset[2].y = -1; // 左
offset[3].x = -1; offset[3].y = 0; // 上
int NumOfNbrs=4;
Position here, nbr;
here.x=start.x;
here.y=start.y;
grid[start.x][start.y] = 2; //起始点距离为2
LinkedQueue < Position > Q;
do { // 标记可达相邻方格
for (int i = 0; i < NumOfNbrs; i++)
{ // NumOfNbrs为相邻方格数
nbr.x = here.x + offset[i].x; // here是正在走线的方格,
nbr.y = here.y + offset[i].y; // nbr是可考虑走线方格
if (grid[nbr.x][nbr.y] == 0)
{ // 该方格未标记
grid[nbr.x][nbr.y] = grid[here.x][here.y] + 1;
// grid[][]中记录该方格距离起始方格距离
if ((nbr.x == finish.x) && (nbr.y == finish.y))
break; // 完成布线
Q.Add(nbr);} //队列中加入新的扩展结点
}
{
friend bool FindPath(Position start,Position finish,int &Pathlen, Position * &path);
public:
Position(int x=0,int y=0)
{
this->x=x;
this->y=y;
}
private:
int x;
int y;
};
bool FindPath(Position start,Position finish,int &Pathlen, Position * &path)
{
if((start.x==finish.x)&&(start.y=finish.y))
{
Pathlen=0;
return 1;
}
int i,j,grid[9][9];
for(i=0;i<9;i++)
for(j=0;j<9;j++)
grid[i][j]=0;
for(i=0;i<=8;i++)
grid[0][i]=grid[8][i]=1;
for(i=0;i<=8;i++)
grid[i][0]=grid[i][8]=1;
grid[1][3]=1;grid[2][3]=1;grid[2][4]=1;grid[3][5]=1;grid[4][4]=1;grid[4][5]=1;grid[7][3]=1;
grid[5][1]=1;grid[5][5]=1;grid[6][1]=1;grid[6][2]=1;grid[6][3]=1;grid[7][1]=1;grid[7][2]=1;
Position offset[4]; //offset是四个移动方向的相对位移矩阵
offset[0].x = 0; offset[0].y = 1; // 右
offset[1].x = 1; offset[2].y = 0;//下
offset[2].x = 0; offset[2].y = -1; // 左
offset[3].x = -1; offset[3].y = 0; // 上
int NumOfNbrs=4;
Position here, nbr;
here.x=start.x;
here.y=start.y;
grid[start.x][start.y] = 2; //起始点距离为2
LinkedQueue < Position > Q;
do { // 标记可达相邻方格
for (int i = 0; i < NumOfNbrs; i++)
{ // NumOfNbrs为相邻方格数
nbr.x = here.x + offset[i].x; // here是正在走线的方格,
nbr.y = here.y + offset[i].y; // nbr是可考虑走线方格
if (grid[nbr.x][nbr.y] == 0)
{ // 该方格未标记
grid[nbr.x][nbr.y] = grid[here.x][here.y] + 1;
// grid[][]中记录该方格距离起始方格距离
if ((nbr.x == finish.x) && (nbr.y == finish.y))
break; // 完成布线
Q.Add(nbr);} //队列中加入新的扩展结点
}
if ((nbr.x == finish.x) && (nbr.y == finish.y)) break;
if(Q.IsEmpty())
return false;
Q.Delete(here);
}while(1);
Pathlen=grid[finish.x][finish.y]-2;
path =new Position[Pathlen];
here=finish;
for(int j=Pathlen-1;j>=0;j--)
{
path[j]=here;
for(i=0;i<NumOfNbrs;i++)
{
nbr.x=here.x+offset[i].x;
nbr.y=here.y+offset[i].y;
if(grid[nbr.x][nbr.y]==j+2) break;
}
here=nbr;
cout<<"position:"<<"("<<here.x<<","<<here.y<<")"<<endl;
}
return 1;
}
if(Q.IsEmpty())
return false;
Q.Delete(here);
}while(1);
Pathlen=grid[finish.x][finish.y]-2;
path =new Position[Pathlen];
here=finish;
for(int j=Pathlen-1;j>=0;j--)
{
path[j]=here;
for(i=0;i<NumOfNbrs;i++)
{
nbr.x=here.x+offset[i].x;
nbr.y=here.y+offset[i].y;
if(grid[nbr.x][nbr.y]==j+2) break;
}
here=nbr;
cout<<"position:"<<"("<<here.x<<","<<here.y<<")"<<endl;
}
return 1;
}
int main()
{
Position path[20];
int a,b,c,d;
cout<<"the start: ";
cin>>a>>b;
Position start(a,b);
cout<<endl<<"the finish: ";
cin>>c>>d;
Position finish(c,d);
int Pathlen;
if(FindPath(start,finish,Pathlen, path)==1)
cout<<"finished!";
return 1;
}
{
Position path[20];
int a,b,c,d;
cout<<"the start: ";
cin>>a>>b;
Position start(a,b);
cout<<endl<<"the finish: ";
cin>>c>>d;
Position finish(c,d);
int Pathlen;
if(FindPath(start,finish,Pathlen, path)==1)
cout<<"finished!";
return 1;
}