环序列
// 回溯求解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; } }