问题描述
我试图解决下一个问题:我有15个不同长度的管道,我需要将其中的一部分分成四行。我必须找到一种组合,使所有行都满了。假设它们是填满所有行的组合,我怎么找到最短的方法呢? 我尝试使用DFS搜索算法,为了使效率更高,我从最长到最短对管道的向量进行了排序。 (解决方案的搜索就像一个图形:管道的每个入口都是DFS图中的新顶点,下一步将是在下一行中输入下一个管道,依此类推)。它太重了,花了很多时间才能运行(三行代码在几分钟内就成功了)。这是c ++中的代码: (在代码中,我称管道针为相同的想法)
'''
void LinesVector :: DFSvisit(vector&allneedles,int lineIndex,int depth) {
if (allNeedles.empty()|| isFull())//is full return true if all the lines are full
return;
//Check if their is one empty line
bool flag = false;
for (size_t i = 0; i < v.size(); i++)
{
if (!v[i].getNeedlesNum())
flag = true;
}
for (int k = 0; k < allNeedles.size();k++)
{
for (int j = 0; j < v.size(); j++)
{
//In case of empty line the needle will be insert
//in ascending order of indexes in order to avoid returns
//Check we can fill the rest lines
if (flag)
{
if (allNeedles.size() == v.size() - 1 - lineIndex)
return;
if (lineIndex == v.size())
return;
}
if (!allNeedles.empty())
{
v[(lineIndex + j) % LInesNUMBER].pushNeedle(allNeedles[k]);
if (v[(lineIndex + j) % LInesNUMBER].isOverload())
v[(lineIndex + j) % LInesNUMBER].popNeedle();
else
{
allNeedles.erase(allNeedles.begin() + k);
DFSvisit(allNeedles,(lineIndex + j + 1) % LInesNUMBER,depth + 1);
if (isFull())
return;
allNeedles.insert(allNeedles.begin() + k,v[(lineIndex + j) % LInesNUMBER].popNeedle());
}
}
}
}
'''
如果他们是通过某种方式解决此问题的一种方式(以这种方式或完全不同的方式),我将很高兴获得答复。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)