zoukankan      html  css  js  c++  java
  • 计算机鼓轮设计(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 }
  • 相关阅读:
    SQL语法:查询此表有另外一个表没有的数据
    .NET平台开源项目速览-最快的对象映射组件Tiny Mapper之项目实践
    win7 64 安装Oracle 11G 、使用PLSQL进行连接 标准实践
    json 筛选数据 $.grep过滤数据
    bootstrap table 行号 显示行号 添加行号 bootstrap-table 行号
    ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践
    JS中判断JSON数据是否存在某字段的方法 JavaScript中判断json中是否有某个字段
    json 数字key json 数字作为主键
    ajax 跨域 headers JavaScript ajax 跨域请求 +设置headers 实践
    扩展:gridview 空数据时显示表头
  • 原文地址:https://www.cnblogs.com/soildom/p/7860335.html
Copyright © 2011-2022 走看看