一个算法的实现?!!

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.
我用这个算法执行起来问题很多,一个是计算时间较长,二是容易出错.
希望哪位高人能指点迷津!!!!! 谢谢!!!!!
...全文
231 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
市面上能下载的《算法导论》中文版都没有目录(标签),阅读极不方便,翻阅困难。本人(crocostone)亲自手动制作了完整的标签,包括章、节、小节的标签,在Acrobat 7.0和9.0版本和FoxitReader 4.2版本均能打开。 而且,我精心调整了文档的大小,打开或点击标签的时候,默认就是最适合阅读、眼睛最舒服的文档大小,无需再调整大小。 本人亲自制作,在CSDN上奉献,欢迎使用!有了目录(标签),学习效率真的可以提高一大截啊!!!注意本压缩包使用WinRAR分卷压缩,4个部分都下载后才能解压! 为什么要分卷:整个文件有130MB,crocostone的上传权限不够,所以只能分卷压缩。已经测试:这4个压缩包,使用WinRAR/7zip/Haozip都能正确解压!!! 内容: 1、全世界唯一带“完整”目录的《算法导论》第二版中文版。 2、目前能找到的多个版本的习题答案和代码,有Java实现的,C++实现的,官方的、非官方的,教参,考试题答案等等! 3、讲义。 4、算法导论第二版最清晰的英文版,文字和伪代码可以拷出来。 书籍介绍: 《算法导论》(Introduction to Algorithms)原书第二版,Thomas H. Cormen(科曼)、Charles E. Leiserson、Ronald L.Rivest、Clifford Stein著,南京大学潘金贵、顾铁成、李成法、叶懋等译,机械工业出版社,2006。本书简称CLRS,麻省理工学院教材,全世界最广泛使用的算法超经典书籍,学习编程必看之书。作者之一的Rivest就是RSA算法发明者的R,2002年图灵奖得主。算法是程序员必练内功。此书主要讨论算法,数据结构方面的内容稍少。中文翻译质量不错。 ########################【对于crocostone本人前面发的算法导论的资源的说明】########################### download.csdn.net/source/3109111和download.csdn.net/source/3109150是一套两个部分的压缩文件,后缀名是001和002,不要改名,只能用7zip和Haozip解压,用WinRAR无法解压,解压后是带章、节、小节目录的算法导论。 download.csdn.net/source/3108513和download.csdn.net/source/3108520是另一套两个部分的压缩文件,后缀名是001和002,不要改名,只能用7zip和Haozip解压,用WinRAR无法解压,解压后是带章目录的算法导论,但是没有节和小节的目录。 本人的电脑以前没有WinRAR,而是一直使用7zip,但是7zip制作的zip分卷压缩格式竟然与WinRAR不兼容,导致前面发的资源,用WinRAR的网友说无法解压,在这里表示抱歉!使用7zip或Haozip的人都解压成功了。 这次发的资源,4个压缩包,使用WinRAR/7zip/Haozip都能正确解压! 请CSDN网友,下载完,评论的同时,要点击评论框上方的五角星(共5个五角星),这样你的被扣的积分就可以返还,还会加一分。如果只评论,不点击小五角星,积分不会返还。一定要先下载完,再评论。如果先评论后下载,或者在下载的过程中评论,积分同样不会返还。 数据结构教材,我强烈推荐Sartaj Sahni著《数据结构算法与应用——C++语言描述》。这是一部难得的好书,作者循序渐进,娓娓道来,每一种数据结构和算法都给出了详细的实现代码和运行结果,而且代码质量极高,甚至可以直接照搬到商业软件开发中。此书的算法部分也很精到,比算法导论更容易学习和入门。Sartaj Sahni《数据结构算法与应用——C++语言描述》全集,包含中英文图书、代码、习题答案、演示动画,都是我亲自从此书的官方网站下载并汇总的,绝对权威,请在这里下载:download.csdn.net/source/3043982 算法和数据结构是计算机的绝对核心技术。学好核心技术,既为了自己,也为了天空不落下别国的炸弹,别国的天空落下我们的炸弹!

65,199

社区成员

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

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