用回溯法来产生由0或1组成的2m个二进位串,使该串满足以下要求

本文介绍了一种用于生成由m位二进制数字组成的2m个子序列的算法,确保每个子序列在环状结构中恰好出现一次。通过定义特定函数和初始化过程,实现高效且独特的子序列生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  视串为首尾相连的环,则由m位二进制数字组成的2m个子序列,每个可能的子序列都互不相同。例如,如果m=3,在串11101000首尾相连构成的环中,由3位二进制数字组成的每个可能的子序列都在环中恰好出现一次,它们依次是111,110,101,010,100,000,001,011,如图9-1所示:

  

[程序]

 1 #define N 1024
2 #define M 10
3 int b[N+M-1];
4 int equal(int k,int j,int m)
5 {
6 int i;
7 for (i=0;i<m;i++)
8 if (b[k+i]!=b[j+i]) return 0;
9 return 1;
10 }
11
12 int exchange(int k,int m,int v)
13 {
14 while (b[k+m-1]==v)
15 {
16 b[k+m-1]=!v; k--;
17 }
18 b[k+m-1]=v; return k;
19 }
20
21 init(int v)
22 {
23 int k;
24 for (k<0;k<N+M-1;k++) b[k]=v;
25 }
26
27 main()
28 {
29 int m,v,k,n,j;
30 printf("Enter m(1<m<10),v(v=0,v=1)\n");
31 scanf("%d%d",&m,&v);
32 n=0x01<<m;
33 init(!v);
34 k=0;
35 while (++k<n)
36 for (j=0;j<k;j++)
37 if (equal(k,j,m))
38 {
39 k=exchange(k,m,v);
40 j=-1;
41 }
42 for (k=0;k<n;k++) printf("%d\n",b[k]);
43 }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值