#include <iostream>
#include <fstream>
using namespace std;
const int INF = 100000;
const int MAX = 50;
int p[MAX][MAX];
int bestx[MAX];
int x[MAX];
int minLen = INF;
int n, m; //电路板数,连接块数
int low[MAX]; //记录电路块中最左端电路板下标
int heigh[MAX]; //记录电路块中最右端电路板下标
int len(int n)
{
int i;
for(i=1; i<=m; i++)
{
low[i] = INF;
heigh[i] = 0;
}
for(i=1; i<=n; i++) //电路板
for(int j=1; j<=m; j++) //连接块
if(p[x[i]][j]>0) //如果电路板x[i]在连接块j中
{
if(i < low[j])
low[j] = i;
if(i > heigh[j])
heigh[j] = i;
}
int max = 0; //电路板最大长度
for(i=1; i<=m; i++)
if(heigh[i]>0 && low[i]<INF && heigh[i]-low[i]>max)
max = heigh[i] - low[i];
return max;
}
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
void backtrack(int i)
{
if(i==n)
{
int ld = len(i);
if(ld < minLen)
{
minLen = ld;
for(int j=1; j<=n; j++)
bestx[j] = x[j];
}
}
else
for(int r=i; r<=n; r++)
{
swap(x[i], x[r]);
if(len(i) < minLen)
backtrack(i+1);
swap(x[i], x[r]);
}
}
int main()
{
ifstream fin("电路板.txt");
cout << "输入电路板个数:";
fin >> n; cout << n;
cout << "\n输入连接块个数:";
fin >> m; cout << m;
cout << "\n输入矩阵:\n";
int i, j;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
fin >> p[i][j];
cout << p[i][j] << " ";
}
cout << endl;
}
for(i=1; i<=n; i++)
x[i] = i;
backtrack(1);
cout << "\n排列的最小长度为:" << minLen;
cout << "\n最佳排列为:\n" ;
for(i=1; i<=n; i++)
cout << bestx[i] << " ";
cout << endl;
cout << endl;
fin.close();
return 0;
}
最小长度电路板排列问题
最新推荐文章于 2024-06-19 16:42:35 发布