假设一个旋转鼓的表面被等分为16个部分,如图所示,其中每一部分分别由导体或绝缘体构成,图中阴影部分表示导体,空白部分表示绝缘体,导体部分给出信号1,绝缘体部分给出信号0。根据鼓轮转动时所处的位置,
四个触头A、B、C、D将获得一定的信息。因此,鼓轮的位置可用二进制信号表示。试问如何选取鼓轮16个部分的材料才能使鼓轮每转过一个部分得到一个不同的二进制信号,即每转一周,能得到0000到1111的16个数。
1 // 2 // main.cpp 3 // 4 // Created by Soildom on 2017/11/19. 5 // Copyright © 2017年 Soildom. All rights reserved. 6 // 7 8 #include <iostream> 9 #include <cmath> 10 #include <stack> 11 #include <deque> 12 #include <vector> 13 using namespace std; 14 15 const int MAXN=10000; 16 int sub_len,node_num; 17 bool edge[MAXN][MAXN]; 18 19 class node 20 { 21 public: 22 int data[MAXN]={0},vis=0; 23 vector<int> start,end; 24 }; 25 26 node v[MAXN]; 27 stack<int> t; 28 deque<int> node_stack; 29 30 void build_node() 31 { 32 int num; 33 for (int i=0; i<node_num; i++) 34 { 35 num=i; 36 while (!t.empty()) 37 t.pop(); 38 while (num) 39 { 40 t.push(num%2); 41 num/=2; 42 } 43 for (int j=sub_len-1-(int)t.size(); j<sub_len-1; j++) 44 { 45 v[i].data[j]=t.top(); 46 t.pop(); 47 } 48 for (int j=1; j<sub_len-1; j++) 49 v[i].start.push_back(v[i].data[j]); 50 for (int j=0; j<sub_len-2; j++) 51 v[i].end.push_back(v[i].data[j]); 52 } 53 } 54 55 void dfs(int n) 56 { 57 v[n].vis++; 58 node_stack.push_back(n); 59 if (v[n].start==v[n].end&&v[n].vis<2&&edge[n][n]==0) 60 { 61 edge[n][n]=true; 62 dfs(n); 63 return; 64 } 65 for (int i=0; i<node_num; i++) 66 { 67 if (v[i].vis>=1||edge[n][i]==true||i==n||v[n].start!=v[i].end) 68 continue; 69 edge[n][i]=true; 70 dfs(i); 71 return; 72 } 73 for (int i=0; i<node_num; i++) 74 { 75 if (v[i].vis>=2||edge[n][i]==true||i==n||v[n].start!=v[i].end) 76 continue; 77 edge[n][i]=true; 78 dfs(i); 79 } 80 } 81 82 void print_sequence() 83 { 84 cout<<"对应的布鲁因序列为:"; 85 for (int i=0; i<sub_len-1; i++) { 86 cout<<v[node_stack.front()].data[i]; 87 } 88 node_stack.pop_front(); 89 while (node_stack.size()>sub_len-2) { 90 cout<<v[node_stack.front()].data[sub_len-2]; 91 node_stack.pop_front(); 92 } 93 94 // while (!node_stack.empty()) { 95 // for (int i=0; i<sub_len-1; i++) 96 // cout<<v[node_stack.front()].data[i]; 97 // cout<<" "; 98 // node_stack.pop_front(); 99 // } 100 //打印节点顺序 101 } 102 103 int main() 104 { 105 cout<<"输入子序列的长度:"; 106 cin>>sub_len; 107 if (sub_len==1) { 108 cout<<"对应的布鲁因序列为:01"<<endl; 109 return 0; 110 } 111 node_num=pow(2, sub_len-1); 112 build_node(); 113 node_stack.clear(); 114 dfs(0); 115 116 // cout<<node_stack.size()<<endl; 117 // for (int i=0; i<node_num; i++) { 118 // cout<<v[i].vis<<" "; 119 // } 120 // cout<<endl; 121 //打印每个节点的情况 122 123 print_sequence(); 124 cout<<endl; 125 126 // for (int i=0; i<node_num; i++) { 127 // for (int j=0; j<sub_len-1; j++) { 128 // cout<<v[i].data[j]; 129 // } 130 // cout<<" "; 131 // } 132 //打印节点序列 133 }