| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4077 人关注过本帖
标题:悬赏千金求一算法
只看楼主 加入收藏
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
以下是引用myajax95在2006-5-21 4:58:00的发言:

和12楼16楼的基本想法查不多,但由于可能的顺序太多,如果不找到特殊的规律算法复杂度就是N!量级。算到12后就很慢了。
很多数没有解.

恩..12楼的其实也是穷举法.昨天我做了..也不比我的少几个for

如果象你说的那样..5.6 9.10等..无解的话

那么 feng1256 昨天告诉我的规律就是对的..这下得研究下了..


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-05-21 08:44
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
我前面贴的程序是对于一个数出现第一个解就停掉,如果取消掉这个限制,发现3,4是两个解,除去对称的就是一个。7有52个解,也就是26个不重复的。8大约有二三百个解。看来解的数目也几乎是阶乘增长的。那这算法就没什么可说的了。

http://myajax95./
2006-05-21 09:45
龙轩v亚风
Rank: 1
等 级:新手上路
威 望:1
帖 子:1073
专家分:0
注 册:2006-4-20
收藏
得分:0 
....我晕 太夸张了 这个帖子 引出这么多高手呀!!!

期待我这个菜蛋 快点 成长

向大家学习~~~

狂风扫落叶,扫把都失业!拍卖QQ:559372
2006-05-21 09:54
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

呵呵,厉害啊,我回去做了一下,也是用穷举的.却出错了...
#include <stdio.h>
#define N 3
int a[2*N]={0};
int b[N+1]={0};
void dosort(int k)
{
int i;
if(k<N)
for(i=1;i<N+1;i++)
{
if(b[i]==0&&a[k]==0&&a[k+i+1]==0&&k+i+1<2*N)
{
b[i]=1;
a[k]=a[k+i+1]=i;
dosort(k+1);
b[i]=a[k]=a[k+i+1]=0;
}
}
if(k==N)
{
for(i=0;i<2*N;i++)
printf("%5d",a[i]);
printf("\n");
}
}
int main()
{
dosort(0);
getch();
}

谁可以告诉我错哪了?


对不礼貌的女生收钱......
2006-05-21 09:57
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

当N大于3的时候就算不出来了???
还请版主和高手帮我看看,
谢谢了!!


对不礼貌的女生收钱......
2006-05-21 10:12
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
楼上的,先说说你的思路呀。

http://myajax95./
2006-05-21 10:26
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

好,您等下,我注释下


对不礼貌的女生收钱......
2006-05-21 10:41
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用soft_wind在2006-5-21 9:57:00的发言:


#include <stdio.h>
#define N 3
int a[2*N]={0};   /*初始为0,用来存储数组*/
int b[N+1]={0};   /*数组用来标记检查,如,b[3]=1,表示3这个数已经被用在数组a[]中,如果为0表示还没有被用到排列中*/
void dosort(int k)
{
int i;
if(k<N)
for(i=1;i<N+1;i++)
{
if(b[i]==0&&a[k]==0&&a[k+i+1]==0&&k+i+1<2*N)  /*如果数i没被用且a[k]和a[k+i+1]这个位置还没被占据,同时下标不能越界*/
{
b[i]=1;   /*标记i,表示i已经被用了*/
a[k]=a[k+i+1]=i;   /*填入数i,两者距离为i+1*/
dosort(k+1); /*继续递归*/
b[i]=a[k]=a[k+i+1]=0;  /*恢复原始值,以便进入下一重循环*/
}
}
if(k==N)  /*此时数已经全部填充完,输出*/
{
for(i=0;i<2*N;i++)
printf("%5d",a[i]);
printf("\n");
}
}
int main()
{
dosort(0);
getch();
}

谁可以告诉我错哪了?

谢谢了!!!!!!!

对不礼貌的女生收钱......
2006-05-21 10:50
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
没这么简单的。缺很多条件,
/*如果数i没被用且a[k]和a[k+i+1]这个位置还没被占据,同时下标不能越界*/
如果占据了怎么办?不能什么都不作,还得在后面接着找地方放,直到全找编了为止。这其实是个挺罗嗦的算法。

http://myajax95./
2006-05-21 10:59
my1286
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-5-15
收藏
得分:0 
,我根本就不怎么懂,就更不用说做了,我向大家学习啊

2006-05-21 11:22
快速回复:悬赏千金求一算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034420 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved