• 计算机鼓轮设计(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 }
  • 相关阅读:
    微信证书发布涉及到的问题
    C# Timer自带定时器
    微信accesstoken回调
    c#数组乱序,打乱数组
    JS 数组乱序
    百度地图LBS开放平台AK一直没有用
    C# 微信支付证书使用
    提交失败问题一:检测到有潜在危险
    apache如何发布地图服务
    Java后端进阶教程
  • 原文地址:https://www.cnblogs.com/soildom/p/7860335.html
Copyright © 2020-2023  润新知