关闭

队列—布线问题

标签: 数据结构 c++ 队列
269人阅读 评论(0) 收藏 举报
分类:

.转来的别人的,修改了其中一个小bug.

#include <iostream>  
#include <queue>  
using namespace std;
int m = 8;
int n = 8;
int grid[10][10];
int indexcount = 0;
struct Position
{
	int row;
	int col;
};
void showPath()
{
	for (int i = 0; i<10; i++)
	{
		for (int j = 0; j<10; j++)
			cout << grid[i][j] << " ";
		cout << endl;
	}
	cout << "------------------" << endl;
}
bool FindPath(Position start, Position finish, int &PathLen, Position  *&path)
{
	if ((start.row == finish.row) && (start.col == finish.col))
	{
		PathLen = 0;
		cout << "start=finish" << endl;
		return true;
	}  
	for (int i = 1; i<9; i++)
	{
		for (int j = 1; j<9; j++)
			grid[i][j] = -1;

	}
	grid[1][3] = -2;
	grid[2][3] = -2;
	grid[2][4] = -2;
	grid[3][5] = -2;
	grid[4][4] = -2;
	grid[4][5] = -2;
	grid[5][5] = -2;
	for (int i = 0; i <= m + 1; i++)
		grid[0][i] = grid[n + 1][i] = -2;  
	for (int i = 0; i <= n + 1; i++)
		grid[i][0] = grid[i][m + 1] = -2; 
	cout << "完整图" << endl;
	showPath();
	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] = 0;
	 
	cout << "布线前图" << endl;
	showPath();

	queue<Position> Q;
	do  
	{
		for (int 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] == -1)
			{
				grid[nbr.row][nbr.col] = grid[here.row][here.col] + 1;
				if ((nbr.row == finish.row) && (nbr.col == finish.col)) break; 
				Q.push(nbr);
			}

		}
		
		if ((nbr.row == finish.row) && (nbr.col == finish.col)) break;
		 
		if (Q.empty()) return false;
		here = Q.front();
		Q.pop();
		indexcount++;
	} while (true);
	
	PathLen = grid[finish.row][finish.col];
	path = new Position[PathLen]; 
	here = finish;
	for (int j = PathLen - 1; j >= 0; j--)
	{
		path[j] = here; 
		for (int 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] == j)
			{
				break;
			}
		}
		here = nbr;
	}
	return PathLen;
}
int main()
{
	Position start; 
	start.row = 3;
	start.col = 2;
	cout << "布线起点" << endl;
	cout << start.row << " " << start.col << endl;
	Position finish;
	finish.row = 4;
	finish.col = 6;
	 
	cout << "布线结束点" << endl;
	cout << finish.row << " " << finish.col << endl;
	int PathLen = 0;
	Position *path;

	FindPath(start, finish, PathLen, path);
	cout << "布线后路径图" << endl;
	showPath();
	cout << "路径" << endl;
	for (int i = 0; i<PathLen; i++)
	{
		cout << path[i].row << " " << path[i].col << endl;
	}
	cout << "布线问题完毕!" << endl;
	system("pause");
	return 0;
}

0
0
查看评论

队列的应用—电路布线最优解问题

首先什么是电路布线问题呢?电路布线问题是类似于迷宫的问题,也是一个模拟矩阵,迷宫是每个点有8个方向可以走,但是在电路布线问题中每个点上只有上下左右4个方向可走。因为电路布线不允许对角线上布线,并且电路布线问题要求线路所走过的路程必须是最短的,即从出发点到目的点路径很可能有很多,要找的是经过跳数最少的...
  • ZLhy_
  • ZLhy_
  • 2013-02-05 20:39
  • 2791

ACM经典问题--布线问题(三)

1. 问题描述 印刷电路板将布线区域划分成 n×m 个方格阵列,要求确定连接方格阵列中的方格a 点到方格b 的最短布线方案。在布线时,电路只能沿直线布线,为了避免线路相交,已布了线的方格做了封锁标记,其他线路不允许穿过被封锁的方格。问线路至少穿过几个方格。 输入格式 输入的第一行是两个整数...
  • whzhaochao
  • whzhaochao
  • 2013-10-19 17:12
  • 1221

布线问题 队列式分支算法

印刷电路板将布线区域划分成n*m个方格阵列。精确的电路布线问题要求确定链接方格a到方格b的最短布线方案。在布线时,电路只能沿直线或者直角布线。为了避免线路相交,已布了线的方格做了封锁标记(红色方格),其他线路不允许穿过被封锁的方格。 下面讨论用队列式分支界限法来...
  • weiyang_8765
  • weiyang_8765
  • 2017-07-17 14:47
  • 171

布线问题-分支限界法

布线问题就是在 M×N 的方格阵列中,指定一个起点 a、一个终点 b,要求找到起点到终点的最短布线方案(最短路径)。 搜索从起点 a 开始,到目标点 b 结束。约束条件:有边相连且未成布线。 搜过过程:从起点 a 开始,将其作为一个扩展结点,沿 a 的上、下、左、右 4 个方向的相邻结...
  • TQH_Candy
  • TQH_Candy
  • 2016-08-20 15:03
  • 1595

算法设计--电路布线问题(分支限界法求解)

电路布线问题--分支限界法求解 一 问题描述: 布线问题:印刷电路板将布线区域划分成n×m个方格阵列,要求确定连接方格阵列中的方格a的中点到方格b的中点的最短布线方案。在布线时,电路只能沿直线或直角布线,为了避免线路相交,已布了线的方格做了封锁标记,其他线路不允许穿过被封锁的方格。 ...
  • wwj_748
  • wwj_748
  • 2013-06-24 16:36
  • 3526

算法java实现--动态规划--电路布线问题

电路布线算法的java实现 具体问题描述以及
  • qipanliming
  • qipanliming
  • 2014-04-25 10:01
  • 1655

c++ 数据结构 队列应用之电路布线

队列的应用之电路布线 与迷宫问题相似,但是栈不足以找出最短路径,队列却可以实现该功能。
  • sinat_34927324
  • sinat_34927324
  • 2016-12-06 20:26
  • 440

运用分支限界法解决布线问题

#include typedef struct { int row; int col; }Position; int FindPath (Position start, Position finish, int &PathLen, Position *&path) { /...
  • qq_16151611
  • qq_16151611
  • 2014-12-11 09:41
  • 766

电路布线问题的几种动态规划算法

在一块电路板的上、下两端分别有n个接线柱。根据电路设计,要求用导线(i,π(i))将上端接线柱i与下端接线柱π(i)相连。 其中,π(i),1<=i<=n是{1,2,…,n}的一个排列。导线(i,π(i))称为该电路板上的第i条连线。对于任何1<=i π(j)。 在制作电路板时,要...
  • QiaoRuoZhuo
  • QiaoRuoZhuo
  • 2017-04-01 09:10
  • 1225

CODEVS 1231最优布线问题

#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; int n,m,aa,bb,cc,cur=0,p[1000100],k=0; long long ans=0...
  • qq_36409190
  • qq_36409190
  • 2016-11-04 01:04
  • 286
    个人资料
    • 访问:18638次
    • 积分:726
    • 等级:
    • 排名:千里之外
    • 原创:52篇
    • 转载:4篇
    • 译文:2篇
    • 评论:1条
    最新评论