| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4073 人关注过本帖
标题:悬赏千金求一算法
只看楼主 加入收藏
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
以下是引用soft_wind在2006-5-21 11:48:00的发言:
谢谢了!
你要帮我改出来,我也送您一千金币,
不过我现在好象还不知道怎么送出去

金币不用了,给你说说我大概的思路吧。
无论12楼,16楼,还是我的算法都是要找出所有的组合。或者是求出16楼的那个多元一次方程的所有整数解。没什么花巧。只要知道的1~N的排列顺序就可以推出0~2N内他们是怎么排列的了,这两者是一一对应的。所以然后再看是不是对的。于是问题就变成了1~N这些数怎么排列。共N!种组合。可能算法书上会有例子。这里我自己想的办法就是从空链表起叉入第一个数。“1”,然后“2”可以在“1”之前叉入,也可以在“1”之后插入。对于每一个结果,用“3”向其中插入,“3”可以选择的位置有3个,于是这样递归找出所有排列。复杂度为N!。对最后生成的没一个排列进行验证。例如1~8的一个排列是13245768,那么插入1在第0个和第2个位置,插入3在第1个和第4个位置。插入2在第2个位置,发现第2个位置已被占,于是想后找知道有空位的地方位置。看第二个“2”的位置是否合法,如果不合法,就错了,继续生成下一个排列。


http://myajax95./
2006-05-21 12:22
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
楼上您这个算法我昨天用过,
不过我链表很差,用来做这样的题,
昨晚用笔写了很久没写出来..
所以今天才改成用数组来做的.

对不礼貌的女生收钱......
2006-05-21 12:26
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
数组没什么问题,就是把新元素插入的时候很多己有的元素需要整体的右移,十分麻烦。

http://myajax95./
2006-05-21 12:30
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
恩,数组是有这个毛病,移动的时候太不方便。
俺回去再用链表谢谢看,哎!
谢谢了!

对不礼貌的女生收钱......
2006-05-21 12:33
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
收藏
得分:0 
以下是引用myajax95在2006-5-21 12:22:00的发言:

金币不用了,给你说说我大概的思路吧。
无论12楼,16楼,还是我的算法都是要找出所有的组合。或者是求出16楼的那个多元一次方程的所有整数解。没什么花巧。只要知道的1~N的排列顺序就可以推出0~2N内他们是怎么排列的了,这两者是一一对应的。所以然后再看是不是对的。于是问题就变成了1~N这些数怎么排列。共N!种组合。可能算法书上会有例子。这里我自己想的办法就是从空链表起叉入第一个数。“1”,然后“2”可以在“1”之前叉入,也可以在“1”之后插入。对于每一个结果,用“3”向其中插入,“3”可以选择的位置有3个,于是这样递归找出所有排列。复杂度为N!。对最后生成的没一个排列进行验证。例如1~8的一个排列是13245768,那么插入1在第0个和第2个位置,插入3在第1个和第4个位置。插入2在第2个位置,发现第2个位置已被占,于是想后找知道有空位的地方位置。看第二个“2”的位置是否合法,如果不合法,就错了,继续生成下一个排列。



用递归可以写一个(群举),不过还是数字大了还是慢`! 这题就这样吧


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-05-21 14:09
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
#include<stdio.h>
#define MAX 65535
void out(int a,int b,int c,int d,int e,int f,int g,int h)
{ static ans;
char s[17]={0};
s[ 6-a]=s[15-a]='8';
s[ 7-b]=s[15-b]='7';
s[ 8-c]=s[15-c]='6';
s[ 9-d]=s[15-d]='5';
s[10-e]=s[15-e]='4';
s[11-f]=s[15-f]='3';
s[12-g]=s[15-g]='2';
s[13-h]=s[15-h]='1';
printf("%3d: %s\n",++ans,s);
}
void main()
{ int ans=0;
unsigned short s=0;
long a,b,c,d,e,f,g,h;
char A,B,C,D,E,F,G,H;
for(A=0,a=513;a<=MAX;a*=2,A++){s|=a;
for(B=0,b=257;b<=MAX;b*=2,B++)if(s+b==(s|b)){s|=b;
for(C=0,c=129;c<=MAX;c*=2,C++)if(s+c==(s|c)){s|=c;
for(D=0,d= 65;d<=MAX;d*=2,D++)if(s+d==(s|d)){s|=d;
for(E=0,e= 33;e<=MAX;e*=2,E++)if(s+e==(s|e)){s|=e;
for(F=0,f= 17;f<=MAX;f*=2,F++)if(s+f==(s|f)){s|=f;
for(G=0,g= 9;g<=MAX;g*=2,G++)if(s+g==(s|g)){s|=g;
for(H=0,h= 5;h<=MAX;h*=2,H++)if(s+h==(s|h)){s|=h;
if(s==MAX)out(A,B,C,D,E,F,G,H);
s^=h;}s^=g;}s^=f;}s^=e;}s^=d;}s^=c;}s^=b;}s^=a;}
}
/*本题共有300个解*/

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-21 14:31
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
收藏
得分:0 
以下是引用–★–在2006-5-21 14:31:00的发言:
#include<stdio.h>
#define MAX 65535
void out(int a,int b,int c,int d,int e,int f,int g,int h)
{ static int ans;
char s[17]={0};
s[ 6-a]=s[15-a]='8';
s[ 7-b]=s[15-b]='7';
s[ 8-c]=s[15-c]='6';
s[ 9-d]=s[15-d]='5';
s[10-e]=s[15-e]='4';
s[11-f]=s[15-f]='3';
s[12-g]=s[15-g]='2';
s[13-h]=s[15-h]='1';
printf("%3d: %s\n",++ans,s);
}
void main()
{ int ans=0;
unsigned short s=0;
long a,b,c,d,e,f,g,h;
char A,B,C,D,E,F,G,H;
for(A=0,a=513;a<=MAX;a*=2,A++){s|=a;
for(B=0,b=257;b<=MAX;b*=2,B++)if(s+b==(s|b)){s|=b;
for(C=0,c=129;c<=MAX;c*=2,C++)if(s+c==(s|c)){s|=c;
for(D=0,d= 65;d<=MAX;d*=2,D++)if(s+d==(s|d)){s|=d;
for(E=0,e= 33;e<=MAX;e*=2,E++)if(s+e==(s|e)){s|=e;
for(F=0,f= 17;f<=MAX;f*=2,F++)if(s+f==(s|f)){s|=f;
for(G=0,g= 9;g<=MAX;g*=2,G++)if(s+g==(s|g)){s|=g;
for(H=0,h= 5;h<=MAX;h*=2,H++)if(s+h==(s|h)){s|=h;
if(s==MAX)out(A,B,C,D,E,F,G,H);
s^=h;}s^=g;}s^=f;}s^=e;}s^=d;}s^=c;}s^=b;}s^=a;}
}
/*本题共有300个解*/


叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-05-21 14:48
nunu582
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2005-11-23
收藏
得分:0 

我真的是菜鸟啊....你们的程序怎么都这么厉害?
我也想要一点点奖金啊..能送我点不?


我在www.中渐渐成长了
2006-05-21 15:06
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
/*N=11情况下有35584个解,最后那个解是
b6a293286375ba94857141。
当N大于15小于32要用VC++的__int64取代long
以下是递归版。
*/
#define N 11
#include<stdio.h>
#include<math.h>
unsigned long MAX;
void fun(int ix)
{
unsigned long a=1+pow(2,ix+1);
static unsigned long n[N],s=0;
if(ix)
{
for(n[ix-1]=0;a<MAX;a+=a,n[ix-1]++)
if(s+a==(s|a)) /*此处有点意思*/
{ s|=a;
fun(ix-1);
s^=a;
}
}
else if(s==MAX)
{
static long ans;
char i,s[2*N+1]={0};
for(i=0;i<N;i++)
s[2*N-3-n[i]-i]=s[2*N-1-n[i]]=
(i>=9?i-9+'a':i+'1');
printf("%ld: %s\n",++ans,s);
}
}
void main()
{
MAX=pow(4,N)-1;
fun(N);
}

[此贴子已经被作者于2006-5-21 19:22:58编辑过]


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-21 18:40
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
本题当且仅当N=3,4,7,8,11,12,15,16......时有解。

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-21 19:09
快速回复:悬赏千金求一算法
数据加载中...
 
   



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

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