// 回溯求解n项素数和环,c551
#include<stdio.h>
#include<math.h>
void main()
{ int t,i,j,n,k,s,a[2000],b[1000];
printf(" 前n个正整数组成素数和环,请输入整数n: ");
scanf("%d",&n);
for(k=1;k<=2*n;k++) b[k]=0;
for(k=3;k<=2*n;k+=2)
{for(t=0,j=3;j<=sqrt(k);j+=2)
if(k%j==0)
{t=1;break;}
if(t==0) b[k]=1; // 奇数k为素数的标记
}
printf(" 前%d个正整数组成素数和环,其中5个为:\n",n);
a[1]=1;s=0;
i=2;a[i]=2;
while(1)
{t=1;
for(j=1;j<i;j++)
if(a[j]==a[i] || b[a[i]+a[i-1]]!=1) // 出现相同元素或非素时返回
{t=0;break;}
if(t && i==n && b[a[n]+1]==1)
{ s++;
printf(" %d: 1",s);
for(j=2;j<=n;j++) printf(",%d",a[j]);
printf("\n");
if(s==5) return;
}
if(t && i<n)
{i++;a[i]=2;continue;}
while(a[i]==n && i>1) i--; // 实施回溯
if(i>1) a[i]++;
else break;
}
}
// n阶德布鲁金环序列回溯设计,c552
#include <stdio.h>
#include <math.h>
void main()
{??int d,i,h,k,j,m,m1,m2,n,s,t,x,a[200];
printf("请输入(2<n)n: "); scanf("%d",&n);
m=1;
for(k=1;k<=n;k++) m=m*2; // 计算m=2^n
s=0;
for(k=0;k<=m+n;k++) a[k]=0;
a[n]=1;a[m-1]=1;
i=n+1;
while(1)
{if(i==m-2)
{for(h=0,j=n+1;j<=m-2;j++)
if(a[j]==0) h++;
if(h==m/2-n) // 判别是否有m/2-n个零
{for(t=0,k=0;k<=m-2;k++)
for(j=k+1;j<=m-1;j++)
{d=1;m1=0;m2=0;
// 检验是否有相同的由n相连数字组成的二进制数
for(x=n-1;x>=0;x--)
{m1=m1+a[k+x]*d; m2=m2+a[j+x]*d;d=d*2;}
if(m1==m2) {t=1;break;}
}
if(t==0)
{s++;
if(n<=4 || (n>4 && s<=3))
{printf("NO(%5d): ",s);
for(j=0;j<=m-1;j++)
printf("%d",a[j]);
printf("\n");
}
}
}
}
if(i<m-1)
{i++;a[i]=0;continue;}
while(a[i]==1 && i>n+1) i--; // 向前回溯
if(a[i]==1 && i==n+1) break;
else a[i]=1;
}
}