一个算法的实现?!!

icybing992 2005-10-09 04:18:54
本人现在做一个关于排列的程序, 现有n个零件
1 将p1零件排放在板材的左下角
2 将pi(i=2,3,…,n)置于所有零件右边最大高度处,交替向下向左移动pi,首先尽可能向下移动,然
后再尽可能向左移动,直至pi无法向下向左移动为止(即接触到其他零件或板材边界为止
).

首先做了一个判断零件是否相交的函数bIntersectionInPartMgr().返回一个 bool值
下面是从零件p2开始的移动部分的程序:
//先向下移动
if (!bIntersectionInPartMgr()) {

while (!bIntersectionInPartMgr()) {
pt.y -= 5;
}
pt.y += 5;
}

if (!bIntersectionInPartMgr()) {
while (!bIntersectionInPartMgr()){

pt.x -= 5;
// 向下优先
if (!bIntersectionInPartMgr()) {
while (!bIntersectionInPartMgr()) {

pt.y -= 5;
}
pt.y += 5;
}

}
pt.x += 5;
}

在这个算法中每个零件移动的单位是5.整个材料的长度和宽度都为300.
我用这个算法执行起来问题很多,一个是计算时间较长,二是容易出错.
希望哪位高人能指点迷津!!!!! 谢谢!!!!!
...全文
220 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
商科程序员 2005-10-10
  • 打赏
  • 举报
回复
试试下面的这个行不行?
while (1)
{
int Y = pt.y;
int X = pt.x;
//先向下移动
while (!bIntersectionInPartMgr())
{
pt.y -= 5;
}
pt.y += 5;
//再向左移动
while (!bIntersectionInPartMgr())
{
pt.x -= 5;
}
pt.x += 5;
//如果最后的位置没变,就退出,说明向左向下都不能再动了。
//如果以下判断不成立,则说明向左或向下移动过,所以也就可能还可以移动。
if (pt.y == Y && pt.y == X)
break;
}

肯定有更好的办法,限于时间,写了一个逻辑最简单的。
商科程序员 2005-10-10
  • 打赏
  • 举报
回复
我就不写代码了,这个问题可以用二维数组完成。
把每个零件当做是一个矩形的充满"1"的矩形
向左移是把最右边的一列"1"置为0,左边的一列"0"置为'1'。向下移差不多。
在移之前先判断左边或是下边的一行或列是不是都是'0'。
不知道我的这种解答你是否满意。
如下:



|___________ |
| |__________ |
| Pi || Pj | |
| ||________|_|
|__________| |111111||
|1111111|______|111111||
|1111111|111111|111111||
|1111111|111111|111111||
------------------------

还有,你的题目算法是不可能出现第二层的,因为你的每一个新零件都是放在前一零件的右上角
这样,你的这个零件肯定可以一直移动到最底边,这样下一下零件肯定出现在这个零件的右边,
然后又是向下落。这样,一直到300的宽度放不下新零件(前一个零件的右上角在第290列,
而新零件的宽是11,就放不了了。请你仔细考虑一下是不是这样,还是你放新零件的条件没说全?
icybing992 2005-10-10
  • 打赏
  • 举报
回复
首先感谢chouy的解答!!!!!
新零件的放置条件是:置于所有零件右边最大高度处,即必须是所有零件中最右侧的.不一定是前一个零件的右侧.
结果肯定是第一行放不下之后,才会放到第二行.
icybing992 2005-10-09
  • 打赏
  • 举报
回复
这个问题其他的都不需要大家考虑,就请帮我解决一下移动的问题就好了. 即在一个空间位置,先向下移动,移动不了之后向左移(如果可以向左移),向左移动之后如果又可以向下移动了那么则向下移动.直到 向左向下都不能移动,也就是零件相交.

首先做了一个判断零件是否相交的函数bIntersectionInPartMgr().返回一个 bool值
bIntersectionInPartMgr()为0时表示不相交.
下面是从零件移动部分的程序 pt代表要移动的零件的位置:
//先向下移动
if (!bIntersectionInPartMgr()) {

while (!bIntersectionInPartMgr()) {
pt.y -= 5;// 零件先向下移动
}
pt.y += 5;
}

if (!bIntersectionInPartMgr()) {
while (!bIntersectionInPartMgr()){

pt.x -= 5;//零件向左移动
// 向下优先
if (!bIntersectionInPartMgr()) {
while (!bIntersectionInPartMgr()) {

pt.y -= 5;// 向左移动后看是否可以向下移动,要是可以则移动
}
pt.y += 5;
}

}
pt.x += 5;
}
icybing992 2005-10-09
  • 打赏
  • 举报
回复
零件都是矩形,大小不一,不是5的倍数. 5是我选择的每次移动的距离.也可以是其他的数字.
最后排好的情况应该差不多是这个样子的.
| |
|___________ |
| |__________ |
| Pi || Pj | |
| ||________|_|
|__________| | ||
| |______| ||
| P1 | | P3 ||
| | P2 | ||
------------------------
商科程序员 2005-10-09
  • 打赏
  • 举报
回复
有一个问题:每个零件都一样大吗?
为什么只能移动5?
每个零件的每个边都是5的倍数吗?
零件是正方形,矩形还是不规则?
照你的意思不是
_________ |------|
| |______| | |
| P1 | | P3 | ... |
| | P2 | | |
--------------------------------------
icybing992 2005-10-09
  • 打赏
  • 举报
回复
是这个意思! 辛苦了!
商科程序员 2005-10-09
  • 打赏
  • 举报
回复
问题表达不清!
是不是这样?
_________________________________
| |
| |
| |
| |
| |
| |
| |
| |
| _____ |
| | | |
| | P2 | |
|_______|_____| |
| | |
| P1 | |
| | |
-----------------------------------

画这个太费劲了!
icybing992 2005-10-09
  • 打赏
  • 举报
回复
比方说p6开始可以向下移动,则向下移动,直到不能移动,然后看是否可以向左移动,如果可以则向左移动,此时还要考虑向左移动后是否又可以向下移动了,如果可以的话,那么就要优先向下移动.
直到该零件向下和向左均无法移动.
icybing992 2005-10-09
  • 打赏
  • 举报
回复
是这样的,第一个零件p1在最左侧,最下方.第二个零件p2先放在第一个的右上角(即p2的左下角在p1的右上角处),然后看是否可以向下或者向左移动. 以后的第n个零件 开始也是放在所有零件中最右侧且最高处.
然后看是否可以移动! 并且要优先向下移动,然后再向左移动,直到不能移动为止!
bigpin 2005-10-09
  • 打赏
  • 举报
回复
不明白题目是什么意思,但是感觉主要的问题在于你调用你的bIntersectionInPartMgr()的次数太多了,导致效率太低
whzhhit 2005-10-09
  • 打赏
  • 举报
回复
1 将p1零件排放在板材的左下角
2 将pi(i=2,3,…,n)置于所有零件右边最大高度处,交替向下向左移动pi,首先尽可能向下移动,然
后再尽可能向左移动,直至pi无法向下向左移动为止(即接触到其他零件或板材边界为止

????????????????????????????????????不明白什么意思???第一个都已经在最最下角拉,怎么还能往下往左移???
xiaocai0001 2005-10-09
  • 打赏
  • 举报
回复
Mark

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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