读书人

排列与结合

发布时间: 2012-12-27 10:17:10 作者: rapoo

排列与组合

先是一个递归的排列,顺便复习以下bitset的用法

//递归,保存当前状态的

#include <bitset>#include <stdio.h>using namespace std;const int NUM = 6;bitset<NUM> flag;char data[NUM];int order[NUM];void printPermut(int no);int main(){for(int i=0 ; i<NUM ; i++ ){data[i] = char('a'+i);}flag.set();printPermut(NUM);}void print(){for(int i=0 ; i<NUM ; i++ ){printf("%c",data[order[i]]);}printf("\n");}void printPermut(int no){for(int i = 0;i<NUM ;i++){if(flag.test(i)){order[NUM-no] = i;flag.flip(i);printPermut(no-1);flag.flip(i);}}if(no == 1)print();}

?回一下bitset的方法

bitset例子

#include "stdafx.h"#include <iostream>#include <bitset>using namespace std;int _tmain(int argc, _TCHAR* argv[]){    bitset<32> bitvec(8);bool flag = bitvec.any();//判断是否存在某位或者多位为1,有则返回truebool flag1 = bitvec.none();//判断是否所有的位都是0,是则返回truebool flag2 = bitvec.test(3);//测试第4位是否为1,是则返回truecout<<"第4位为:"<<bitvec[3]<<endl;//输出第4位的值bitvec.reset(3);//将第4位设置为0,或者bitvec[3] = 0cout<<"第4位为:"<<bitvec[3]<<endl;//输出第4位的值bitvec.reset();//将所有位设置为0cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;bitvec.set();//将所有位设置为1cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;bitvec = 8;cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;bitvec.flip();//将所有的位翻转cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;bitvec.flip(0);//翻转第一位cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;bitvec = 0xffff;//设置低16位为1cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;bitvec = 012;//用八进制值012设置bitveccout<<"bitvec的值为:"<<bitvec.to_string()<<endl;string bit = "1011";bitset<32> bitvec1(bit);//用字符串对象初始化bitset<32>对象cout<<"bitvec1的值为:"<<bitvec1.to_string()<<endl;string bit1 = "1111110101100011010101";bitset<32> bitvec2(bit1,6);//用 从第6位开始到字符串结束 这一部分 初始化bitvec2 cout<<"bitvec2的值为:"<<bitvec2.to_string()<<endl;bitset<32> bitvec3(bit1,6,4);//用 从第6位开始,长度为4 这一部分 初始化bitvec3;cout<<"bitvec3的值为:"<<bitvec3.to_string()<<endl;} 

?下面是一个非递归的算法,和上面的本来就不一样,因为上面的那种方法一开始没写出来非递归的。。。

交换的方法

#include <stdio.h> #include <stdlib.h> //排列与组合的非递归算法,排列是交换,组合是选择//从n个元素的数组a中,取m个元素的组合bool zuhe(int a[],int n,int m) {//p[x]=y 取到的第x个元素,是a中的第y个元素    int index,i,*p;     p=(int*)malloc(sizeof(int)*m);    if(p==NULL)        return false;    index=0;    p[index]=0;//取第一个元素    while(true)    {         if(p[index]>=n)        {//取到底了,回退            if(index==0)             {//各种情况取完了,不能再回退了                break;            }            index--;//回退到前一个            p[index]++;//替换元素        }         else if(index==m-1)         {//取够了,输出            for(i=0;i<m;i++)             {                printf("%d,",a[p[i]]);             }            printf("\n");             p[index]++; //替换元素        }         else         {//多取一个元素            index++;             p[index]=p[index-1]+1;         }     }    free(p);    return true;}//对n个元素的数组a,进行全排列bool pailie(char a[],int n){//p[x]=y 取到的第x个元素,是a中的第y个元素    int i,j,temp,*p;     p=(int*)malloc(sizeof(int)*n);    if(p==NULL)    {        return false;    }    for(i=0;i<n;i++)    {//初始排列        p[i]=i;    }    while(true)    {//循环m=n!次        //输出一种排列情况        for(i=0;i<n;i++)         {            printf("%c",a[p[i]]);         }        printf("\n");             //从后向前查找,看有没有后面的数大于前面的数的情况,若有则停在后一个数的位置。        for(i=n-1;i>0 && p[i]<p[i-1];i--);            //若没有后面的数大于前面的数的情况,说明已经到了最后一个排列,返回        if(i==0) break;        //从后查到i,查找大于p[i - 1]的最小的数,记入j        for(j=n-1;j>i && p[j]<p[i-1];j--);        //交换p[i-1]和p[j]        temp=p[i-1];p[i-1]=p[j];p[j]=temp;        //倒置p[i]到p[n-1]        for(i=i,j=n-1;i<j;i++,j--)        {//交换p[c]和p[d]             temp=p[i];p[i]=p[j];p[j]=temp;        }     }    free(p);    return true;}int main() {     int a[]={1,2,3,4,5};char data[] = {'a','b','c','d','e','f'};zuhe(a,5,3);    pailie(data,4);//排列    return 0;}
?

?

读书人网 >编程

热点推荐