分支限界法之布线问题

来源:计算机等级考试    发布时间:2012-08-28    计算机等级考试视频    评论

  int i ;

  for( i=0; i<= m+1; i++)

  grid[0][i]=grid[n+1][i]=1; //顶部和底部

  for( i=0; i<= n+1; i++)

  grid[i][0]=grid[i][m+1]=1; //左翼和右翼

  int j ;

  //初始化相对位移

  Position offset[4];

  offset[0].row=0; offset[0].col=1;//右

  offset[1].row=1; offset[1].col=0;//下

  offset[2].row=0; offset[2].col=-1;//左

  offset[3].row=-1; offset[3].col=0;//上

  int NumOfNbrs=4;//相邻方格数

  Position here,nbr;

  here.row=start.row;

  here.col=start.col;

  grid[start.row][start.col]=2;

  //标记可达方格位置

  //LinkedQueue<Position> Q;

  Queue Q ;

  Q.end = 0 ;

  Q.begin = 0 ;

  do {//标记相邻可达方格

  for( 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]==0)

  {

  //该方格未被标记

  grid[nbr.row][nbr.col]=grid[here.row][here.col]+1;

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

  break; //完成布线

  //Q.Add(nbr);

  Q.col[Q.end] = nbr.col;

  Q.row[Q.end] = nbr.row;

  Q.end++;

  }

  }

  //是否到达目标位置finish?

  if((nbr.row==finish.row)&&(nbr.col==finish.col)) break;//完成布线

  //活结点队列是否非空?

  if(Q.begin==Q.end) return false;//无解

  else

  {

  here.row=Q.row[Q.begin];

  here.col=Q.col[Q.begin];

  Q.begin++;//取下一个扩展结点

  }

  }while(true);

  //构造最短布线路径

  PathLen=grid[finish.row][finish.col]-2;

  path=new Position[PathLen];

  //从目标位置finish开始向起始位置回溯

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答