如何修改这段源码?

ratrat 2001-09-09 09:48:36
从一组数字1,2,3,4,...m个数中抽出k个不同的数,列出所有的组合(k<m).编码如下:
#include <stdio.h>
#define MAXN 100
int a [MAXN]
void comb(int m,int k)
{int i,j;
for(i=m;i>=k;i--){
a[k]=i;
if(k>1)
comb (i-1,k-1);
else{
for (i=a[0];j>0;j--) printf(%4d,a[j]);
printf("\n");
}
}
}
void main()
{a[0]=3, comb(5,3);
}
这是用递归法写的源码,如果增加一个条件:形成的组合中,只有一个相邻数之差为1,例如,数组(87,32,56,57,90)中,只有57与56之差为1,再如,数组(78,45,46,49,97)中,只有47与46之差为1。请大侠改之。


--------------------------------------------------------------------------------

...全文
87 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nepton 2001-09-10
这样行么?

#include <iostream.h>
/////////////////////////////////////////////////////
void List(int nTotal,int nLeave);
bool Check(int n,int nValue);
/////////////////////////////
int aSrc[100]={1,2,3,4,5};
int aTemp[100];
/////////////////////////////
void main()
{
int n=5;
List(n,n);
}

void List(int nTotal,int nLeave)
{
int i;
if(nLeave==0)
{
int nCount=0;
for(i=0;i<nTotal-1;i++)
if( (aTemp[i]-aTemp[i+1])*(aTemp[i]-aTemp[i+1])==1 )
nCount++;
if(nCount==1)
{
for(i=0;i<nTotal;i++)
cout<<aTemp[i]<<' ';
cout<<endl;
}
return;
}
for(i=0;i<nTotal;i++)
{
if(Check(nTotal-nLeave,aSrc[i])==true)
{
aTemp[nTotal-nLeave]=aSrc[i];
List(nTotal,nLeave-1);
}
}
return;
}


bool Check(int n,int nValue)
{
int i;
for(i=0;i<n;i++)
if(aTemp[i]==nValue)
return false;
return true;
}
回复
ratrat 2001-09-09
Nepton(小牛牛) :-) 你好!
如果增加一个条件:形成的组合中,只有一个相邻数之差为1,例如,数组(87,32,56,57,90)中,只有57与56之差为1,再如,数组(78,45,46,49,97)中,只有47与46之差为1。
那么在你下面这段源码中怎样添加新代码?
--------------------------------------------------------------------------------
#include <iostream.h>
/////////////////////////////////////////////////////
void List(int nTotal,int nLeave);
bool Check(int n,int nValue);
/////////////////////////////
int aSrc[100]={1,2,3,4,5};
int aTemp[100];
/////////////////////////////
void main()
{
int n=5;
List(n,n);
}

void List(int nTotal,int nLeave)
{
int i;
if(nLeave==0)
{
for(i=0;i<nTotal;i++)
cout<<aTemp[i]<<' ';
cout<<endl;
return;
}
for(i=0;i<nTotal;i++)
{
if(Check(nTotal-nLeave,aSrc[i])==true)
{
aTemp[nTotal-nLeave]=aSrc[i];
List(nTotal,nLeave-1);
}
}
return;
}


bool Check(int n,int nValue)
{
int i;
for(i=0;i<n;i++)
if(aTemp[i]==nValue)
return false;
return true;
}
--------------------------------------------------------------------------------

回复
ratrat 2001-09-09
#include <stdio.h>
#define MAXN 100
int a [MAXN]
void comb-back (int m,intk)
{int i,j;
i=0;a[i]=1;
do{
if (a[i]-i<=m-k+1{
if(i==r-1){
for (j=0;j,k,j++) printf("%4d,a[j]);
printf("\n");
a[i]++;
continue;
}
i++;
a[i]=a[i-1]=1;
}
else{
if (i==0)return;
a[--i]++;
}
}while(1);
}
}
void main()
{ comb-back(5,3);
}
回复
Nepton 2001-09-09
我刚才那题的算法,昨天我贴了一次
#include <iostream.h>
/////////////////////////////////////////////////////
void List(int nTotal,int nLeave);
bool Check(int n,int nValue);
/////////////////////////////
int aSrc[100]={1,2,3,4,5};
int aTemp[100];
/////////////////////////////
void main()
{
int n=5;
List(n,n);
}

void List(int nTotal,int nLeave)
{
int i;
if(nLeave==0)
{
for(i=0;i<nTotal;i++)
cout<<aTemp[i]<<' ';
cout<<endl;
return;
}
for(i=0;i<nTotal;i++)
{
if(Check(nTotal-nLeave,aSrc[i])==true)
{
aTemp[nTotal-nLeave]=aSrc[i];
List(nTotal,nLeave-1);
}
}
return;
}


bool Check(int n,int nValue)
{
int i;
for(i=0;i<n;i++)
if(aTemp[i]==nValue)
return false;
return true;
}
回复
ratrat 2001-09-09
你写的是用的回朔法,我现在把回朔法的源码写出,等一下。
回复
Nepton 2001-09-09
我没太清楚懂你的意思,是不是像这样:
假如有12345,则:
1 2 3 4 5
1 2 3 5 4
1 2 4 3 5
1 2 4 5 3
1 2 5 3 4
1 2 5 4 3
1 3 2 4 5
1 3 2 5 4
1 3 4 2 5
1 3 4 5 2
1 3 5 2 4
1 3 5 4 2
1 4 2 3 5
1 4 2 5 3
1 4 3 2 5
1 4 3 5 2
1 4 5 2 3
1 4 5 3 2
1 5 2 3 4
1 5 2 4 3
1 5 3 2 4
1 5 3 4 2
1 5 4 2 3
1 5 4 3 2
2 1 3 4 5
.
.
.
.
.
回复
ratrat 2001-09-09
改一下好吗?
回复
Nepton 2001-09-09
你的程序好像有问题。
回复
发动态
发帖子
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告