两两颜色组成的珠子的组合共有 N ∗ ( N − 1 ) / 2 N*(N-1)/2 N∗(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;
}