【搜索】传感器 @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;
}
原文地址:https://www.cnblogs.com/NeilThang/p/9356622.html