两两颜色组成的珠子的组合共有N∗(N−1)/2N*(N-1)/2N∗(N−1)/2个,他们全部组合串联需要的珠子也是那么多个。并且第一个珠子是谁都无所谓,所以就直接定第一个珠子为0。再用一张二维表记录访问过的组合即可。
#include <bits/stdc++.h>
using namespace std;
bool link[50][50];
int necklace[2000];
int N;
int num;
void initlink(){
memset(link,1,sizeof(link));
for(int i=0;i<N;i++){
link[i][i]=0;
}
}
bool f(int a,int i){
if(a==num){
if(i==0){
return true;
}
else return false;
}
for(int j=0;j<N;j++){
if(link[i][j]){
link[i][j]=0;
link[j][i]=0;
if (f(a+1,j)){
necklace[a]=i;
return true;
}
link[i][j]=1;
link[j][i]=1;
}
}
return false;
}
int main()
{
while(~scanf("%d",&N)){
num=N*(N-1)/2;
initlink();
f(0,0);
printf("%d\n",num);
for(int i=0;i<num;i++){
printf("%d ",necklace[i]);
}
printf("\n");
}
return 0;
}
本文探讨了由两两颜色不同的珠子组成项链的算法实现。通过定义初始链接矩阵并递归寻找所有可能的组合,最终输出组合总数及具体序列。文章提供了完整的C++代码示例,展示了如何有效解决此类组合问题。
1605

被折叠的 条评论
为什么被折叠?



