zoukankan      html  css  js  c++  java
  • 位运算

    常见位运算操作:x>>j&1,判断x二进制下从右往左第j个数是不是1.

                                如果要枚举32个状态,可以把1<<32,每一位代表一个状态

                                以两道递归题为例。

    题目1:给你1~n个数,从中选取任意多的数,然后输出所有可能的结果

    思路分析:每一个数都面临选与不选两种可能性,所以可以用一个二进制下为n位的数来保存每一个结果,如果第k位是0,则表示数k不选,如果第k位为1,则表示数k被选中。

                      这里保存两种状态,当前要枚举的数是第几个数,还有哪些数已经被枚举过了,这个用一个n位的二进制数实现。并且如果当前数被选进去 ,则将其对应的二进制位置1,state+(1<<cur);

                      如果没有被选进去,则保存的数组仍然是state。下面上代码

    #include<iostream>
    
    using namespace std;
    
    int n;
    
    void dfs(int cur,int state)
    {
        if(cur==n)
        {
            for(int i=0;i<n;i++)
            {
                if(state>>i&1)
                cout<<i+1<<" ";
            }
            cout<<"
    ";
        }
        else
        {
            dfs(cur+1,state);
            dfs(cur+1,state+(1<<cur));
        }
    }
    
    int main()
    {
           cin>>n;
           dfs(0,0);       
           return 0;                                  
     } 

  • 相关阅读:
    凯立德2015夏季3621J0P4G卡版分区地图
    红山军马场坝上地图全集
    红山军马场坝上地图全集
    “坝上”到底在哪里?
    “坝上”到底在哪里?
    他山之石:OpenGL书籍推荐
    OpenGL3:开头篇 介绍
    Windows开发:WinSDK初始化
    C++03:论类的构造函数和析构函数
    MFC:绘图基础
  • 原文地址:https://www.cnblogs.com/rainyskywx/p/10293534.html
Copyright © 2011-2022 走看看