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

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

  视串为首尾相连的环,则由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 }



相关文章
|
7月前
|
存储 算法 程序员
串是什么,串存储结构的3种实现方法
串是什么,串存储结构的3种实现方法
121 8
|
7月前
|
关系型数据库 测试技术 RDS
【动态规划】【字符串】【状态压缩】943 最短超级串
【动态规划】【字符串】【状态压缩】943 最短超级串
|
7月前
|
机器学习/深度学习 算法 JavaScript
【动态规划】【回文】【字符串】1278分割回文串 III
【动态规划】【回文】【字符串】1278分割回文串 III
【Leetcode -704.二分查找 -709.转换成小写字母 -717.1比特与2比特字符】
【Leetcode -704.二分查找 -709.转换成小写字母 -717.1比特与2比特字符】
37 0
|
4月前
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
字符串中的KMP算法及其改进
字符串中的KMP算法及其改进
|
算法 Linux
字符串-KMP算法
字符串-KMP算法
75 0
|
存储 机器学习/深度学习 人工智能
八、串,数组和广义表
八、串,数组和广义表
八、串,数组和广义表
|
存储 算法 C语言
串、串的模式匹配算法(子串查找)BF算法、KMP算法
串、串的模式匹配算法(子串查找)BF算法、KMP算法