布线问题(已运行通过),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.运行效果如图所示
#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.运行效果如图所示
相关文章推荐
- 关于Vs 2005 中出现编译通过,但运行时出现“未使用调试信息生成二进制文件”的问题
- 【asp.net 】使用js结合hidden控件实现在后台运行一段程序后提示确认,确认通过后继续执行后台代码~~~
- android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConnection实现,以及乱码问题解决
- 算法java实现--分支限界法--布线问题
- 使用动态分配和指针操作求 9 个 double 数的乘积(编译通过了,但是运行时出错,谁能帮我看看出了什么问题啊)[em08]
- 使用Apache通过JK实现多Tomcat负载均衡集群时,Apache不能将请求分发给Tomcat处理(即Apache反向代理不成功)的问题
- web项目Log4j日志输出路径配置问题 问题描述:一个web项目想在一个tomcat下运行多个实例(通过修改war包名称的实现),然后每个实例都将日志输出到tomcat的logs目录下实例名命名的文
- turtlebot/rbx1/mrobot使用follower实现人体跟随(解决运行follower后但小车不动问题)
- 项目中遇到通过使用路由策略实现主从数据库访问数据不同步的问题
- android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConnection实现,以及乱码问题解决
- n皇后问题代码实现(已运行通过)
- 布线问题-分支限界法c++实现
- windows7下实现Bundler并通过cygwin编译运行以及pmvs、cmvs的使用(2)
- Linux学习36_ssh使用公钥授权不通过的问题解决
- linux使用truss、strace和ltrace、gdb命令诊断软件运行问题
- struts2使用ajax实现页面和action之间通过json数据交互
- Android通过使用webview实现和js的交互
- Tinker集成和使用(一)Tinker简介和运行Tinker示例出现的问题
- 在shell脚本中使用expect实现scp传输问题