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

将整个棋盘当作一个二维数组,起始点位置的值赋为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; 
}

用C++实现布线问题相关推荐

  1. 16 导出pcb各网络的布线长度_设计PCB流程

    1. 准备--功能确定.元器件选型(主要核心元器件) 2. 元件库建立--元器件符号.元器件封装 3. 绘制原理图--根据电路功能,将元器件符号进行连接 4. 导出网络表--将元器件的连接关系,以及元 ...

  2. ENJOYLink欢联,以独创技术满足数据中心布线

    [导读]对于占有一栋建筑物或一个建筑群的数据中心来说,如何进行布线尤其关键. 随着各行各业对大数据技术的需求日益增长,数据中心新一轮快速发展已经开始.作为数据中心的基础设施,综合布线系统既要满足机房网 ...

  3. 松江主机点位怎么预留_智能家居设计篇:智能化布线怎么做到有备无患

    [摘要]大家对自己新房的装修总是充满着期待,也有对智能家居向往却又不愿投入太多. | 智 | 装 | 小| 站 | 中国智能家居行业第一自媒体 本文来源:科学讲 特别是对于有所了解的朋友,总觉得智能家 ...

  4. 高密度(HD)电路的设计 (主指BGA封装的布线设计)

    高密度(HD)电路的设计 (主指BGA封装的布线设计) 本文介绍,许多人把芯片规模的BGA封装看作是由便携式电子产品所需的空间限制的一个可行的解决方案,它同时满足这些产品更高功能与性能的要求.为便携式 ...

  5. 六类布线六大注意事项

    六类布线系统在传输速率上可提供高于超五类2.5倍的高速带宽,在100MHz时高于超五类300%的ACR值.在施工安装方面,六类比超五类难度也要大很多. 六类布线系统的施工人员必须按照国际标准要求的规范 ...

  6. 网吧电源和网络布线经验谈(1)

    网吧目前所提供的服务,像网页浏览.网络游戏.在线电影.远程教育等最基本的服务都与网络有关,网络质量的好坏直接决定了网吧的生存能力.所以,如何规划一个优质的网络环境,是网吧经营者必须要考虑的一个要点,其 ...

  7. 综合布线施工中的不规范现象

    综合布线系统是整个计算机通讯系统中最主要的组成部分,布线就像人的神经,纵横交错,但有规可循.俗话说没有规矩,不成方圆.综合布线在施工中也应遵循相关的标准.当然,很多工程人员都是在取得相关的资格之后,才 ...

  8. 综合布线工作组2008年上半年技术课题工作安排会议通知

    中国工程建设标准化协会信息通信专业委员会   建标信通字[2008] 02号 综合布线工作组2008年上半年技术课题工作安排会议通知   各工作组成员 中国工程建设标准化协会信息通信专业委员会综合布线 ...

  9. 综合布线系统设计遵循的标准和条件

    综合布线系统设计遵循的标准和条件 综合布线系统设计遵循的标准和条件 国际标准和规范有: 1)         国际布线标准ISO/IEC 11801-2002 2)         EIA/TIA 5 ...

  10. 什么电线适合在面包板上布线?

    简 介: 对于面包板布线所使用的导线种类.颜色.长度以及耐用性进行讨论.也许没有一个十全十美的选择方案,需要根据情况而定.对于学生来讲,由于电路内容需要经常更换,所以使用双公头的杜邦线比较适合完成实验 ...

最新文章

  1. java array iterator_java数组遍历——iterator和for方法
  2. 为 Confluence 6 配置发送邮件消息
  3. matlab求刚度,matlab直接刚度法计算结构频率
  4. java列表mvc分页_Springmvc完成分页的功能
  5. C#网络编程----(三)委托和多线程
  6. Micropython教程之TPYBoard开发板制作电子时钟(萝卜学科编程教育)
  7. CentOS7.3 本地环境安装
  8. 10大优秀的移动Web应用程序开发框架
  9. kodi 自动升级_如何设置您的Kodi库以自动更新
  10. diagram怎么记忆_怎样记英语单词本子单词记忆法原则让每个学生真正的
  11. 接龙管家-Python自动打卡
  12. E - New Year Snowmen
  13. MATLAB 3db波束宽度提取,秒换算毫秒(3db波束宽度估算公式)
  14. 使用ardunio制作神秘礼物(环境光传感器、舵机、LED、蜂鸣器)
  15. qt vs tools
  16. jieba分词 自定义词表简介
  17. 计算机音乐我还是曾经那个少年,我还是曾经的那个少年什么歌曲?是谁唱的?求科普!...
  18. 2007年中国优秀无线互联网站点TOP50点评
  19. 西南大学计算机与信息科学学院奖学金,西南大学“玉辉奖学金”成立暨颁奖仪式顺利举办...
  20. word中英文单词间距过大——换行或断字加横杠

热门文章

  1. 一篇博客搞定Django基础
  2. 科学计算机又称6,计算机应用基础试题2
  3. 超级详细的手把手教你使用Lighthouse更好推动项目性能优化,性能指标详解,优化方法,需要关注指标分析
  4. 测试网络速度的软件 哪款好,网络测速工具有哪些?2018网络测速工具推荐
  5. 华为、H3C、锐捷、思科四大厂商交换机配置命令,网工人不得不知
  6. 一个500强公司的数据化运营管理实践 1
  7. PPC手机上网设置大全
  8. C# 屏幕保护程序制作
  9. kali免杀工具Veil Evasion
  10. android listview删除刷新,如何刷新Android ListView?