您的位置:首页 > 编程语言 > C语言/C++

布线问题(已运行通过),C++语言实现,使用分支限界法

2016-10-10 17:56 323 查看
1.代码展示

#include <iostream>
#include <queue>
#include<iomanip>
using namespace std;
//二维数组代表一个图
int grid[100][100];
int indexCount=0;
//输出整张图
void showPath();
//初始化整张图
void grid_init();
int length=0;
struct Position
{
int row;
int col;
};
//初始化整张图
void grid_init()
{
//初始化图int grid[20][20];-1代表未被访问的点
int i,j;
for(i=1;i<9;i++)
{
for(j=1;j<9;j++)
{
grid[i][j]=-1;
}
}
//初始化围墙,1代表围墙
for(i=1;i<9;i++)
{
grid[i][1]=-2;
grid[i][8]=-2;
grid[1][i]=-2;
grid[8][i]=-2;
}
//增加围墙的点
//grid[2][3]=-2;
grid[3][3]=-2;
grid[4][3]=-2;
}
//根据起始位置和终点位置获得最短可行路径,若找到不经返回true,否则返回false
bool FindPath(Position start,Position finish,Position *&path)
{
int i,j;
if(start.row==finish.row && start.col==finish.col)
{
cout<<"起始位置和终点位置在同一坐标位置上";
return false;
}
cout<<"输出初始化的完整图如下:";
showPath();
//定义上,右,下,左4个方向
Position offset[4];
offset[0].row=-1;offset[0].col=0;//上
offset[1].row=0;offset[1].col=1;//右
offset[2].row=1;offset[2].col=0;//下
offset[3].row=0;offset[3].col=-1;//左
Position current,neighbor;
current.col=start.col;//起点的值是-1
current.row=start.row;
//2代表路径
grid[current.row][current.row]=0;
cout<<"开始布线之前的状态如下:"<<endl;;
showPath();
queue<Position> Q;
while(true)
{
for(i=0;i<4;i++)
{
neighbor.col=current.col+offset[i].col;
neighbor.row=current.row+offset[i].row;
//如果邻居顶点是可以通行的,则对邻居顶点进行+1标记
if(grid[neighbor.row][neighbor.col]==-1)
{
grid[neighbor.row][neighbor.col]=grid[current.row][current.col]+1;
}
if(neighbor.row==finish.row && neighbor.col==finish.col)
break;
//如果这个点符合条件,则压入队列
Q.push(neighbor);
}
if(neighbor.row==finish.row && neighbor.col==finish.col) break;
if(Q.empty()) return false;//
current=Q.front();
//从队列里取出下一个扩展节点
Q.pop();
indexCount++;
}
//length用于记录找寻到的路径的长度,从-1开始累加,因为起始位置的值是-1
length=grid[finish.row][finish.col];
path=new Position[length];
//从终点位置开始向起始位置回溯
current=finish;
//
for(j=length;j>=0;j--)
{
if(grid[current.row][current.col]!=-2)
{
grid[current.row][current.col]=length;
}
path[j]=current;
//找前驱位置
for(i=0;i<4;i++)
{
neighbor.row=current.row+offset[i].row;
neighbor.col=current.col+offset[i].col;
if(grid[neighbor.row][neighbor.col]==(j-1))
{
break;
}
}
//每回溯一步,把当前节点向前推进一步
current=neighbor;
}
cout<<"布线之后的状态如下:"<<endl;;
showPath();
return length;
}
void showPath()
{
int i,j;
cout<<endl;
for(i=1;i<9;i++)
{
for(j=1;j<9;j++)
{
cout<<setw(8)<<grid[i][j];
}
cout<<endl;
}
cout<<"----------------------------------------------------------------------------"<<endl;
}
int main()
{
cout<<"布线图说明:"<<endl;
cout<<endl<<"布线图的规格为8*8。在图中,-2代表墙,-1代表可以通行的路径"<<endl;
Position start,finish;
start.col=1;
start.row=1;
finish.col=3;
finish.row=4;
cout<<endl<<"请输入起点位置:";
cin>>start.row>>start.col;
cout<<"请输入终点位置:";
cin>>finish.row>>finish.col;
grid_init();//初始化整张图
//判断输入的点是否是墙或者输入的点越界
if(grid[start.row][start.col] && grid[finish.row][finish.col] )
{
Position *path;//用于记录路径
FindPath(start,finish,path);
cout<<"路径"<<endl;
int i;
for(i=0;i<length;i++)
{
cout<<path[i].row<<path[i].col<<endl;
}
cout<<"已布线成功";
}
else{
cout<<"输入不正确"<<endl;
}
return 0;
}

2.运行效果如图所示

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐