• 【搜索】传感器 @upcexam6023


    时间限制: 1 Sec 内存限制: 128 MB
    题目描述
    SR最近新买了一款电子桌游
    这个玩具内部是M个围成一圈的传感器。每个传感器都有开和关两种工作状态,分别用1和0表示。显然,从不同的位置触发沿顺时针方向连续检查K个传感器可以得到M个长度为K的01串。SR知道这M个01串应该是互不相同的。
    而且这个桌游的设计很静谧,M会取到最大的可能值。现在SR已经了解到了K的值,他希望你求出M的值,并给出字典序最小的传感器排布方案。
    输入
    一行一个整数K
    输出
    一个整数 M 和一个二进制串,由一个空格分隔。表示可能的最大的 M,以及字典序最小的排布方案,字符 0 表示关, 1 表示开。你输出的串的第一个字符和最后一个字符是相邻的
    样例输入
    3
    样例输出
    8 00010111
    提示
    对于100%的数据 2<=K<=11

    分析样例可以按顺序得到
    000
    001
    010
    101
    011
    111
    110
    100
    所以可以考虑从000开始dfs
    每次对于当前的数x
    dfs(x<<1)
    dfs((x|1)<<1)
    当然前提是没有访问过
    如果两条支路都访问过了,说明形成了一个环
    此时判断递归层数是否等于2n 如果相等就是找到了答案,退出所有递归

    #define FILE() freopen("../../in.txt","r",stdin)
    #include <bits/stdc++.h>
    
    using namespace std;
    
    int ans[2050],vis[2050],n,cel,modi;
    
    void dfs(int sta,int fl) {
        int nex = sta<<1;
        vis[sta] = 1;
        if(modi)ans[fl] = sta&(1<<(n-1))?1:0;
        int flag = 0;
        if(!vis[nex%cel]) {
            dfs(nex%cel,fl+1);
            if(!modi)return;
            flag =1;
        }
        if(!vis[(nex|1)%cel]) {
            dfs((nex|1)%cel,fl+1);
            if(!modi)return;
            flag =1;
        }
        if(flag==0&&fl==(1<<n)-1){
            modi = 0;
        }
        vis[sta] = 0;
    }
    
    int main() {
    //    FILE();
        scanf("%d",&n);
        cel = 1<<n;
        modi =1;
        dfs(0,0);
        printf("%d ",1<<n);
        for(int i=0;i<(1<<n);i++){
            printf("%d",ans[i]);
        }
        puts("");
        return 0;
    }
  • 相关阅读:
    Sublime text追踪函数插件:ctags
    上传项目后服务器的一些设置
    svg可缩放矢量图形
    定时备份mysql
    phpstudy配置ssl
    thinkphp数据表操作恐怖事件。
    把一个数组和另一个数组放进同一个数组
    mysql数据库备份与还原命令
    mysql一些有用的链接
    MySQL各版本的区别
  • 原文地址:https://www.cnblogs.com/NeilThang/p/9356622.html
Copyright © 2020-2023  润新知