计算机鼓轮设计(DFS)

 

假设一个旋转鼓的表面被等分为16个部分,如图所示,其中每一部分分别由导体或绝缘体构成,图中阴影部分表示导体,空白部分表示绝缘体,导体部分给出信号1,绝缘体部分给出信号0。根据鼓轮转动时所处的位置, 

四个触头ABCD将获得一定的信息。因此,鼓轮的位置可用二进制信号表示。试问如何选取鼓轮16个部分的材料才能使鼓轮每转过一个部分得到一个不同的二进制信号,即每转一周,能得到0000111116个数。

  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 }

 

posted @ 2017-11-19 17:00  soildom  阅读(1916)  评论(0编辑  收藏  举报