//参考:http://wenku.baidu.com/link?url=pfD9FxgHfr7uyJcphmGhGDbgNjbEbBT51sfC8Y2sXckQE2j54I9xMGLGSro_c4fZ62xKjbifLH16DBmoQeXeBz_nW3jJC-gJxhL-rgdYy97
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
const int MAX = 50;
int box[MAX][MAX];
int a[MAX][MAX]; //a[i][n]表示i的高度,如i嵌套j,a[i][j]=1
int x[MAX]; //最长嵌套箱序列
int n, d;
//如果i嵌入j,返回1,如果j嵌入i,返回-1,如无嵌套关系,返回0
int nest(int i, int j)
{
sort(box[i], box[i]+d); //将各维度排序
sort(box[j], box[j]+d);
int l;
if(box[i][0] < box[j][0])
{
for(l=1; l<d; l++)
if(box[i][l] >= box[j][l])
return 0;
return 1;
}
else
{
for(l=1; l<d; l++)
if(box[i][l] <= box[j][l])
return 0;
return -1;
}
}
//递归修改嵌套箱深度值
//i嵌入j
void addHeight(int i, int j)
{
if(a[i][n] == a[j][n]){ //cout << i << "=" << a[i][n] << " "; //如果i与j的深度相同
a[j][n]++; //cout << i << "=" << a[i][n] << " ";
}
int k;
for(k=0; k<n; k++)
if(a[j][k] == 1) //j嵌入k
addHeight(j, k); //k的高度增加
}
//寻找最大深度的箱子作为首嵌套箱
int findMax()
{
int i;
int max = a[0][n];
int maxIndex = 0;
for(i=1; i<n; i++)
if(a[i][n] > max)
{
max = a[i][n];
//cout << max << " ";
maxIndex = i; //cout << i << " ";
} //cout << maxIndex << " ";
return maxIndex;
}
//输出最长嵌套箱序列
int trace(int maxIndex)
{
int m;
int count = 0;
int index = maxIndex;
int i;
x[count++] = index;
int temp;
while(a[index][n]>0)
{
m = 0;
for(i=0; i<n; i++)
if(a[i][index]==1 && a[i][n]>=m) //如果i嵌入index,且i的高度最高
{
m = a[i][n];
temp = i;
}
index = temp;
x[count++] = index;
}
return count--;
}
//计算嵌套关系,结点高度
int load()
{
//初始化a
memset(a, 0, sizeof(a));
//计算嵌套关系
int i, j;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
a[i][j] = nest(i, j);
//递归修改嵌套深度
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if(a[i][j] == 1) //如果i嵌入j
addHeight(i, j); //增加j的高度
//寻找最大深度的箱子作为首嵌套箱
int maxIndex = findMax();
//输出最长嵌套箱序列
return trace(maxIndex);
}
int main()
{
ifstream fin("嵌套箱.txt");
while(!fin.eof())
{
cout << "输入箱的个数:";
fin >> n; cout << n;
cout <<"\n输入箱的维数:";
fin >> d; cout << d;
cout << "\n输入箱的各维长度:\n";
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<d; j++)
{
fin >> box[i][j];
cout << box[i][j] << "\t";
}
cout << endl;
}
int count = load();
cout << "\n最长嵌套箱序列长度为:" << count << endl;
cout << "最长嵌套箱序列为:\n";
for(i=count-1; i>=0; i--)
cout << x[i]+1 << " ";
cout << endl;
}
fin.close();
return 0;
}
嵌套箱问题
最新推荐文章于 2024-06-28 20:16:42 发布