跪求回溯法解电路板排列问题(C++)源码 。。眼泪啊。。大侠们救急一下

magicbody 2010-06-01 02:40:22
题目:电路板排列问题的大规模电子系统设计中提出的一个实际问题。该问题的经典提法是:将n块电路板以最佳排列方案插入带有n个插槽的机箱中。n块电路板的不同的排列方式对应于不同的电路板插入方案。
设B={1,2,...,n}是n块电路板的集合。集合L={N1,N2,...,Nm}是n块电路板的m个连接块。其中每个连接块Ni是B的一个子集,且Ni中电路板用同一根导线连接在一起。
例如,设n=8,m=5。给定n块电路板及其m个连接块如下:
B={1,2,3,4,5,6,7,8};L={N1,N2,N3,N4,N5}
N1={4,5,6};N2={2,3};N3={1,3};N4={3,6};N5={7,8};
用文件输入输出,同时要在屏幕上输出.


哪位大侠能做出来并且可以调试的,小弟在此不胜感激。。。。。。。。直接给您100分
...全文
1027 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
michael122 2010-06-02
  • 打赏
  • 举报
回复
在设计机箱时,插槽一侧的布线间隙由电路板排列的密度索确定。因此,电路板排列问题要求对于给定的电路板连接条件,确定电路板的最佳排列,使其具有最小密度。

这些话能不能量化?什么叫密度?怎么样才叫最佳?
jhello 2010-06-02
  • 打赏
  • 举报
回复
暂时性的帮你把帖子顶到首页
magicbody 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 budtang 的回复:]
C/C++ code
#include <iostream>
#include <fstream>
using namespace std;

template <class T> //我定义了一个模板函数,用于交换
void Swap(T &x,T &y)
{
T temp;
temp = x;
x = y;
y = te……
[/Quote]


呃。。。。谢谢你了。。。。。这个只是大学教材里的题目,我选成毕业设计了。。。一般要求结果正确就行,然后是论文和算法的思想。和公司里的要求。。。真的差挺远的。。。。里面好多代码都是书上的源程序,然后自己稍微加了一些模块,从visual studio 改成VC++的。。。。我水平真的很菜。。。很感谢您。。。给您满分。。
budweiser 2010-06-02
  • 打赏
  • 举报
回复
#include <iostream>
#include <fstream>
using namespace std;

template <class T> //我定义了一个模板函数,用于交换
void Swap(T &x,T &y)
{
T temp;
temp = x;
x = y;
y = temp;
}

template <typename T>
void Make2DArray(T** &x, int rows, int cols)
{

x = new T*[rows];
for (int i = 0; i < rows; i++)
{
x[i] = new T[cols];
}
}

class Board
{
friend int ArrangeBoards(int **,int,int,int[]);
private:
void Backtrack(int i);
int len(int w);
int *x, *bestx, *low,*high,bestd,n,m,**B;
};
int Board::len(int w)
{
int i;
for(i=1;i<=m;i++)
{high[i]=0;low[i]=n+1;}
for(i=1;i<=w;i++)
for(int k=1;k<=m;k++)
if(B[x[i]][k])
{if(i<low[k]) low[k]=i;
if(i>high[k]) high[k]=i;

}
int tmp=0;
for(int k=1;k<=m;k++)
if(low[k]<=n && high[k]>0 && tmp<high[k]-low[k])
tmp=high[k]-low[k];
return tmp;
}
void Board::Backtrack(int i)
{
if(i==n)
{
int tmp=len(i);
if(tmp<bestd)
{
bestd=tmp;
for(int j=1;j<=n;j++)
bestx[j]=x[j];
}
}
else
for(int j=i;j<=n;j++)
{
Swap(x[i],x[j]);
int ld=len(i);
if(ld<bestd)
Backtrack(i+1);
Swap(x[i],x[j]);
}
}
int ArrangeBoards(int **B,int n,int m,int bestx[])
{
Board X;
X.x=new int[n+1];
X.low=new int[m+1];
X.high=new int [m+1];
X.B=B;
X.n=n;
X.m=m;
X.bestx=bestx;
X.bestd=n+1;
for(int i=1;i<=n;i++)
X.x[i]=i;
X.Backtrack(1);
delete[] X.x;
delete[] X.low;
delete[] X.high;
return X.bestd;
}

int main()
{
int n,m,*p, i;

//cin>>n>>m;
std::fstream fin("data.txt", std::ios_base::in, std::ios_base::_Openprot);
fin >> n >> m;

p=new int[n+1];
int **B;
Make2DArray<int>(B,n+1,m+1);
for(i=1;i<=n;i++)
for(int j=1;j<=m;j++)
//cin>>B[i][j];
fin >> B[i][j];
cout<<ArrangeBoards(B,n,m,p)<<endl;
for(i=1;i<=n;i++)
cout<<p[i]<<" ";
cout<<endl;
return 0;
}


我把它改了下, 现在用文件输入, 运行没错误, 不过提醒楼主, 该代码其中bug实在太多, 我只是让他没有编译 链接 运行时错误, 其他的bug我都没有改

我觉得楼主有必要认真修改, 如果重要的话 起码应该提高编码质量
budweiser 2010-06-02
  • 打赏
  • 举报
回复
#include <iostream>
#include <fstream>
using namespace std;

template <class T> //我定义了一个模板函数,用于交换
void Swap(T &x,T &y)
{
T temp;
temp = x;
x = y;
y = temp;
}

template <typename T>
void Make2DArray(T** &x, int rows, int cols)
{

x = new T*[rows];
for (int i = 0; i < rows; i++)
{
x[i] = new T[cols];
}
}

class Board
{
friend int ArrangeBoards(int **,int,int,int[]);
private:
void Backtrack(int i);
int len(int w);
int *x, *bestx, *low,*high,bestd,n,m,**B;
};
int Board::len(int w)
{
int i;
for(i=1;i<=m;i++)
{high[i]=0;low[i]=n+1;}
for(i=1;i<=w;i++)
for(int k=1;k<=m;k++)
if(B[x[i]][k])
{if(i<low[k]) low[k]=i;
if(i>high[k]) high[k]=i;

}
int tmp=0;
for(int k=1;k<=m;k++)
if(low[k]<=n && high[k]>0 && tmp<high[k]-low[k])
tmp=high[k]-low[k];
return tmp;
}
void Board::Backtrack(int i)
{
if(i==n)
{
int tmp=len(i);
if(tmp<bestd)
{
bestd=tmp;
for(int j=1;j<=n;j++)
bestx[j]=x[j];
}
}
else
for(int j=i;j<=n;j++)
{
Swap(x[i],x[j]);
int ld=len(i);
if(ld<bestd)
Backtrack(i+1);
Swap(x[i],x[j]);
}
}
int ArrangeBoards(int **B,int n,int m,int bestx[])
{
Board X;
X.x=new int[n+1];
X.low=new int[m+1];
X.high=new int [m+1];
X.B=B;
X.n=n;
X.m=m;
X.bestx=bestx;
X.bestd=n+1;
for(int i=1;i<=n;i++)
X.x[i]=i;
X.Backtrack(1);
delete[] X.x;
delete[] X.low;
delete[] X.high;
return X.bestd;
}

int main()
{
int n,m,*p, i;

//cin>>n>>m;
std::fstream fin("data.txt", std::ios_base::in, std::ios_base::_Openprot);
fin >> n >> m;

p=new int[n+1];
int **B;
Make2DArray<int>(B,n+1,m+1);
for(i=1;i<=n;i++)
for(int j=1;j<=m;j++)
//cin>>B[i][j];
fin >> B[i][j];
cout<<ArrangeBoards(B,n,m,p)<<endl;
for(i=1;i<=n;i++)
cout<<p[i]<<" ";
cout<<endl;
return 0;
}


我把它改了下, 现在用文件输入, 运行没错误, 不过提醒楼主, 该代码其中bug实在太多, 我只是让他没有编译 链接 运行时错误, 其他的bug我都没有改

我觉得楼主有必要认真修改, 如果重要的话 起码应该提高编码质量
magicbody 2010-06-02
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

template <class T> //我定义了一个模板函数,用于交换
void Swap(T &x,T &y)
{
T temp;
temp = x;
x = y;
y = temp;
}

template <typename T>
void Make2DArray(T** &x, int rows, int cols)
{

x = new T*[rows];
for (int i = 0; i < rows; i++)
{
x[i] = new T[cols];
}
}

class Board
{
friend ArrangeBoards(int **,int,int,int[]);
private:
void Backtrack(int i);
int len(int w);
int *x, *bestx, *low,*high,bestd,n,m,**B;
};
int Board::len(int w)
{
for(int i=1;i<=m;i++)
{high[i]=0;low[i]=n+1;}
for(i=1;i<=w;i++)
for(int k=1;k<=m;k++)
if(B[x[i]][k])
{if(i<low[k]) low[k]=i;
if(i>high[k]) high[k]=i;

}
int tmp=0;
for(int k=1;k<=m;k++)
if(low[k]<=n && high[k]>0 && tmp<high[k]-low[k])
tmp=high[k]-low[k];
return tmp;
}
void Board::Backtrack(int i)
{
if(i==n)
{
int tmp=len(i);
if(tmp<bestd)
{
bestd=tmp;
for(int j=1;j<=n;j++)
bestx[j]=x[j];
}
}
else
for(int j=i;j<=n;j++)
{
Swap(x[i],x[j]);
int ld=len(i);
if(ld<bestd)
Backtrack(i+1);
Swap(x[i],x[j]);
}
}
int ArrangeBoards(int **B,int n,int m,int bestx[])
{
Board X;
X.x=new int[n+1];
X.low=new int[m+1];
X.high=new int [m+1];
X.B=B;
X.n=n;
X.m=m;
X.bestx=bestx;
X.bestd=n+1;
for(int i=1;i<=n;i++)
X.x[i]=i;
X.Backtrack(1);
delete[] X.x;
delete[] X.low;
delete[] X.high;
return X.bestd;
}

int main()
{
int n,m,*p;
cin>>n>>m;
p=new int[n+1];
int **B;
Make2DArray<int>(B,n,m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>B[i][j];
cout<<ArrangeBoards(B,n,m,p)<<endl;
for(i=1;i<=n;i++)
cout<<p[i]<<" ";
cout<<endl;
return 0;
}

我是按最小长度做的,编译和链接都没问题,然后输入测试数据,在最后一步运行的时候出错了。。。谁能绑我解决下这个问题。。。。最好可以改成文件输入。。。。。
测试数据如下:
8 5
0 0 1 0 0
0 1 0 0 0
0 1 1 1 0
1 0 0 0 0
1 0 0 0 0
1 0 0 1 0
0 0 0 0 1
0 0 0 0 1

是按照设n=8,m=5,给定n块电路板及其m各连接块如下:
B={1,2,3,4,5,6,7,8}
L={N1,N2,N3,N4,N5}
N1={4,5,6}
N2={2,3}
N3={1,3}
N4={3,6}
N5={7,8}

这个给的测试数据。。。


magicbody 2010-06-01
  • 打赏
  • 举报
回复
眼泪啊。。。。小弟急需。。。。各位大侠们帮帮忙吧。。。。。。。
magicbody 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 superdullwolf 的回复:]
问题是什么?没看出来提问句呀。
[/Quote]
问题如下:
电路板排列问题是大规模电子系统设计中提出的实际问题。该问题的提法是,将n块电路板以最佳排列方案插入带有n个插槽的机箱中。n块电路板的不同排列方式对应于不同的电路板插入方案。
设B={1, 2, …, n}是n块电路板的集合,L={N1, N2, …, Nm}是连接这n块电路板中若干电路板的m个连接块。Ni是B的一个子集,且Ni中的电路板用同一条导线连接在一起。
例如,设n=8,m=5,给定n块电路板及其m各连接块如下:
B={1,2,3,4,5,6,7,8}
L={N1,N2,N3,N4,N5}
N1={4,5,6}
N2={2,3}
N3={1,3}
N4={3,6}
N5={7,8}
在设计机箱时,插槽一侧的布线间隙由电路板排列的密度索确定。因此,电路板排列问题要求对于给定的电路板连接条件,确定电路板的最佳排列,使其具有最小密度。
超级大笨狼 2010-06-01
  • 打赏
  • 举报
回复
问题是什么?没看出来提问句呀。
magicbody 2010-06-01
  • 打赏
  • 举报
回复
我自己顶一下吧。。。。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧