• HihoCoder1182 欧拉路(Fleury算法)


    描述

    小Hi和小Ho破解了一道又一道难题,终于来到了最后一关。只要打开眼前的宝箱就可以通关这个游戏了。

    宝箱被一种奇怪的机关锁住:

    这个机关是一个圆环,一共有2^N个区域,每个区域都可以改变颜色,在黑白两种颜色之间切换。

    小Ho控制主角在周围探索了一下,果然又发现了一个纸片:

    机关黑色的部分表示为1,白色的部分表示为0,逆时针连续N个区域表示一个二进制数。打开机关的条件是合理调整圆环黑白两种颜色的分布,使得机关能够表示0~2^N-1所有的数字。
    我尝试了很多次,终究没有办法打开,只得在此写下机关破解之法。
    	——By 无名的冒险者
    	

    小Ho:这什么意思啊?

    小Hi:我给你举个例子,假如N=3,我们通过顺时针转动,可以使得正下方的3个区域表示为:

    因为黑色表示为1,白色表示为0。则上面三个状态分别对应了二进制(001),(010),(101)

    每转动一个区域,可以得到一个新的数字。一共可以转动2^N次,也就是2^N个数字。我们要调整黑白区域的位置,使得这2^N个数字恰好是0~2^N-1

    小Ho:我懂了。若N=2,则将环上的黑白色块调整为"黑黑白白",对应了"1100"。依次是"11","10","00","01"四个数字,正好是0~3。那么这个"黑黑白白"就可以打开机关了咯?

    小Hi:我想应该是的。

    小Ho:好像不是很难的样子,我来试试!

    输入

    第1行:1个正整数,N。1≤N≤15

    输出

    第1行:1个长度为2^N的01串,表示一种符合要求的分布方案

    样例输入

    3

    样例输出

    00010111
    • 给这2^N个点建图,若a->b要建边,需满足b删第一位等于b删最后一位,a>>1 == b & 2^(n-1)-1,但是这样的话,就是要求一个方案使得每个点路过一次———>哈密顿回路,而哈密顿回路是NP问题,实现起来也麻烦。
    • 换个思路,我们想办法把哈密顿转化为欧拉。然后再用上一题的办法解决。我们把点转化为边。
    • 输出的时候,注意第一位是输出全部,后面的输出最后一位,而且最后那条回路边不输出。
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <cmath>
    using namespace std;
    int used[100010],path[100010],n,m,cnt,tot=1;
    int Laxt[100010],Next[100010],To[100010];
    void print_two(int n)   
    {   
        if(n) f(n>>1);   
        else  return;   
        printf("%d",n%2);   
    }   
    void add(int u,int v)
    {
        Next[++tot]=Laxt[u];
        Laxt[u]=tot;
        To[tot]=v;
    }
    void dfs(int u)
    {
        for(int i=Laxt[u];i;i=Next[i]){
            if(!used[i]){
                used[i]=1;
                dfs(To[i]);
            }    
        }
        path[++cnt]=u;
    }
    int main()
    {
        int i,u,v,P;
        scanf("%d",&n);
        n=pow(2,n);
        for(i=0;i<n;i++){
            add(i>>1,i&((n>>1)-1));
        }
        dfs(1);
        print_two(path[1]);
        for(i=2;i<cnt;i++) printf("%d",path[i]&1);
        return 0;
    }
  • 相关阅读:
    python __init__.py
    估算小结
    ssh vim中不小心按下ctrl+s
    估算方法
    SSH 下使vim语法高亮显示 && 终端下vim配置
    not enough arguments for format string搞死人
    函数的形参 实参
    Linux 共享内存机制
    select函数参数及其使用
    找出两个字符串最长公共子串
  • 原文地址:https://www.cnblogs.com/hua-dong/p/7955504.html
Copyright © 2020-2023  润新知