当前位置: 代码迷 >> C语言 >> 悬赏千金求一算法
  详细解决方案

悬赏千金求一算法

热度:141   发布时间:2006-05-21 08:44:00.0
以下是引用myajax95在2006-5-21 4:58:00的发言:

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

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

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

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


----------------解决方案--------------------------------------------------------
我前面贴的程序是对于一个数出现第一个解就停掉,如果取消掉这个限制,发现3,4是两个解,除去对称的就是一个。7有52个解,也就是26个不重复的。8大约有二三百个解。看来解的数目也几乎是阶乘增长的。那这算法就没什么可说的了。
----------------解决方案--------------------------------------------------------
....我晕 太夸张了 这个帖子 引出这么多高手呀!!!

期待我这个菜蛋 快点 成长

向大家学习~~~
----------------解决方案--------------------------------------------------------

呵呵,厉害啊,我回去做了一下,也是用穷举的.却出错了...
#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();
}

谁可以告诉我错哪了?


----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------
楼上的,先说说你的思路呀。
----------------解决方案--------------------------------------------------------

好,您等下,我注释下


----------------解决方案--------------------------------------------------------
以下是引用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();
}

谁可以告诉我错哪了?

谢谢了!!!!!!!

----------------解决方案--------------------------------------------------------
没这么简单的。缺很多条件,
/*如果数i没被用且a[k]和a[k+i+1]这个位置还没被占据,同时下标不能越界*/
如果占据了怎么办?不能什么都不作,还得在后面接着找地方放,直到全找编了为止。这其实是个挺罗嗦的算法。
----------------解决方案--------------------------------------------------------
,我根本就不怎么懂,就更不用说做了,我向大家学习啊
----------------解决方案--------------------------------------------------------
  相关解决方案