P5657 格雷码

Posted dreagonm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P5657 格雷码相关的知识,希望对你有一定的参考价值。

思路

考场上的递归思路

每次向下递归的时候判断是左半边还是右半边即可
注意向右半边递归之后下一层序列要反转过来即可

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
void solve(unsigned long long n,unsigned long long k,unsigned long long rev=0){
    if(rev)
        k=((1ULL<<(n))-1)-k;
    // cout<<n<<' '<<k<<' '<<rev<<endl<<endl;
    if(n==1){
        if(k==0)
            printf("0");
        else
            printf("1");
        return;
    }    
    if(k>((1ULL<<(n-1))-1)){
        printf("1");
        solve(n-1,k-((1ULL<<(n-1))),1);
    }
    else{
        printf("0");
        solve(n-1,k,0);
    }
}
unsigned long long n,k;
int main(){
    cin>>n>>k;
    solve(n,k);
    return 0;
}

以上是关于P5657 格雷码的主要内容,如果未能解决你的问题,请参考以下文章

GEEK编程练习— —格雷码

腾讯生成格雷码

格雷码如何转换成二进制?

格雷码那点事——递归非递归实现

格雷码的实现

LeetCode 格雷码序列的生成