| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4073 人关注过本帖
标题:悬赏千金求一算法
只看楼主 加入收藏
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
以下是引用–★–在2006-5-21 18:40:00的发言:
/*N=11情况下有35584个解,最后那个解是
b6a293286375ba94857141。以下是递归版
*/
#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);
}

嗯,硬解多元一次方程速度比我那个速度快。因为没一次操作只是数值比较,比我那个又链表又排列的省时间。算到11时已经比较明显了。整数能承受的范围内没什么问题。同时内存管理也简单。


http://myajax95./
2006-05-21 19:11
my1286
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-5-15
收藏
得分:0 

大家好,根据kai的思路,我想出了用插入的方法来实现这个算法,但是我没有去在TC上去试过,现把此过程大致描述一下。
我是这是想的,对它们排序我先只单边排序,先排右边的,左边和右边的顺序是相反的,等会逆一下就行了,现把对右边排序的来说说,我想的是把最大的一个数来插入第一个位置,然后依次插入其它的数,插入完成就说明排序完成了。
下面是对11223344的排序算法的大。。;可能有点小错:
insert(int x)
{int i=0,j=0,count=0,a[9]={0},flage=0;
if (x>0)
{for (i=2;i<=8-x;i++)
{flage=0;
if (a[i]==0&&a[i+x]==0)
a[i]=x,a[i+x]=x,flage=1;
else continue;
if (flage==1&&x==1)
{for (j=1;j<=8;j++)
printf("%3d",a[j]);
printf("\n"),count++;
}
insert(x-1);
}
}return(count);}


main()
{clrscr();
a[1]=4,a[5]=4;
insert(3);
if (count==0) printf("%d不能够排序",x+1);
getch();
}

我对递归不太好,请大家仔细看看,可能我这里面还有好多错,

当然对于那些大的数也就可以弄了,不过我实在弄不出5的,不知道有谁是弄出来的呀?


2006-05-21 19:36
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 
, 不好意思, 我这里最迟晚上12点断网, 昨天晚上刚发完16楼就断网了.
看样子我错过了最精彩的讨论时间啊.都有这么多精彩的程序了.可惜我写的一个程序还没完全调好就没了.
今天早上刚上网就中病毒了,是一个PPT格式的邮件,从我同学那转发过来的(估计是病毒自动转的),里面有个幸福.PPT的文件是恶性病毒!!真够猛的,居然把我的硬盘全格式化了!资料软件全丢了! 今天花了一整天的时间弄电脑,刚才才搞定,现在正在BT上挂VC,郁闷中.........我门这里已经有几台电脑挂了,大家小心啊!

我的征途是星辰大海
2006-05-21 22:14
my1286
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-5-15
收藏
得分:0 

大家帮我看看啊,我也不知道我有哪些错,不过我在写递归的时候感觉不太爽,很不习惯.


2006-05-22 11:31
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 
看样子可以结帖了,感谢各位的参与和给出的思路算法,我来总结一下.

本题的基本思路就是由12楼kai给出的模块移动匹配法,16楼starrysky给出的解方程的方法也是由12楼的方法衍生出来的.
到结帖为止,本帖中共有6人给出了具体的程序,分别是6楼的SunShining,19楼的feng1256,20楼的myajax95,24楼的soft_wind,46和49楼的–★–,52楼的my1286,其中以20楼myajax95和49楼–★-的程序最代表性.
推荐查看12楼,16楼给出的方法和19楼,20楼,49楼给出的程序.

以下是赠送列表
20楼myajax95 200金
49楼
–★- 200金
19楼feng1256 150金
12楼kai 150金
6楼SunShining 100金
24楼soft_wind 100金

金子不多,仅表心意,再次感谢各位的积极参与讨论(可惜我错过了最精彩的讨论时间,遗憾啊)


我的征途是星辰大海
2006-05-23 10:29
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 
怎么操作才能结帖啊?

我的征途是星辰大海
2006-05-23 10:37
my1286
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-5-15
收藏
得分:0 
insert(int x)
{int i=0,j=0,count=0,a[9]={0},flage=0;
if (x>0)
{for (i=2;i<=8-x;i++)
{flage=0;
if (a[i]==0&&a[i+x+1]==0)
a[i]=x,a[i+x+1]=x,flage=1;
else continue;
insert(x-1);
if (flage!=1)
a[i]=0,a[i+x+1]=0;/*/////以前忘了这句,不好意思啊,这句我认为好重要.*/
if (flage==1&&x==1)
{for (j=1;j<=8;j++)
printf("%3d",a[j]);
printf("\n"),count++;
}
}
}return(count);}


main()
{clrscr();
a[1]=4,a[5]=4;
insert(3);
if (count==0) printf("%d不能够排序",x+1);
getch();
}

2006-05-23 13:18
快速回复:悬赏千金求一算法
数据加载中...
 
   



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

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