用C++实现布线问题

布线问题其实可以看成是二维矩阵的赋值问题

将整个棋盘当作一个二维数组,起始点位置的值赋为2,障碍点的值赋为1,其他的点的初值为0

然后就开始执行操作,从起始点出发,每到一个点开始判断是否满足“未遍历过该点”和“该点不是障碍点”的条件,如果满足条件就给该点赋值为距离起始点的位置的步数加2的值,得到到达目标点的步数

最后再由数组的值返回后推出路径信息,以下是详细代码(路障的值,我在代码中简单设了以下,不同的棋盘可能有所不同)

#include"math.h"
#include<iostream>
#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);} //队列中加入新的扩展结点
       }
        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;
}
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; 
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值