先是一个递归的排列,顺便复习以下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,有则返回true
bool flag1 = bitvec.none();//判断是否所有的位都是0,是则返回true
bool flag2 = bitvec.test(3);//测试第4位是否为1,是则返回true
cout<<"第4位为:"<<bitvec[3]<<endl;//输出第4位的值
bitvec.reset(3);//将第4位设置为0,或者bitvec[3] = 0
cout<<"第4位为:"<<bitvec[3]<<endl;//输出第4位的值
bitvec.reset();//将所有位设置为0
cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;
bitvec.set();//将所有位设置为1
cout<<"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位为1
cout<<"bitvec的值为:"<<bitvec.to_string()<<endl;
bitvec = 012;//用八进制值012设置bitvec
cout<<"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;
}
分享到:
相关推荐
高中数学排列与组合知识点 ...3. 组合与排列有联系吗? 结论 排列和组合是高中数学中两个重要的概念,它们之间有着密切的联系,但又有着很大的不同。理解和掌握排列和组合的概念对数学学习非常重要。
思考三:组合与排列有联系吗?回答:是的,组合是选择的结果,排列是选择后再排序的结果。 判断下列问题是组合问题还是排列问题: 1. 设集合A={a,b,c,d,e},则集合A的含有3个元素的子集有多少个?(组合问题) 2. ...
排列与组合 排列是高中数学选修中的一项重要内容,通过本课件的学习,学生可以了解排列的定义、掌握排列数公式及推导方法,并能用“树形图”写出一个排列问题的所有的排列,并能运用排列数公式进行计算。 一、 ...
排列与组合是高中数学选修中的重要概念,主要涉及如何有序地选取和组织元素。排列是将一组不同的元素按照特定顺序进行排列的方式。在排列问题中,元素的顺序至关重要,因为改变顺序会得到一个不同的排列。 1. 排列...
排列与组合是概率论、统计学以及数学竞赛中常见的概念,它们在解决涉及选择和排列问题时起到关键作用。在中学阶段,我们会学习到乘法原理和加法原理,这两个基本原理是理解排列与组合的基础。 乘法原理指出,如果...
排列与组合是数学中基础且重要的概念,它们在解决实际问题和理论研究中都有广泛应用。在本课件中,黄玉霞老师通过一系列...此外,通过反思自己的表现,学生可以自我评估对排列组合概念的理解程度,并寻找提升的空间。
13. 数字问题与排列组合的结合:如题目中组成的数字要大于20000且百位不是3,可以通过排除法结合排列组合计算。 14. 比例关系:题目中m:n=13:2,可以通过比例关系解出班级人数。 15. 连接问题:构建道路连接多个点...
同时,排列与组合与概率知识的结合,为离散型随机变量的分布列学习奠定基础。 教学的重点和难点在于理解排列、组合的基本概念,区分开排列问题和组合问题,掌握排列数、组合数的公式推导及应用,以及排列组合的性质...
在高中数学的教学中,排列与组合是重要的一环,尤其对于新人教A版选修2-3的课程,这部分内容常常让许多学生感到困难。排列与组合的概念与解题方式有其独特性,不同于传统的数学问题,这使得初次接触的学生需要时间...
互学环节鼓励学生之间的互动和合作,通过互相检查对方的结果,发现可能的错误或遗漏,进一步强化对排列组合的理解。小组讨论环节则让学生在团队中分享自己的思考过程,提升表达和倾听的能力。 课程还引入了位值的...
在提供的文档中,题目涉及了多个排列组合的具体应用,包括抽取不同元素、任务分配、概率计算等。 1. 第一题是关于素数的选择问题,其中涉及到组合的概念。从10个不同的素数中选取两个不同的数,根据组合公式C(n, k)...
排列与组合是数学中的基本概念,特别是在概率论和统计学中有着广泛的应用。这个PPT学习教案主要针对二年级的学生,旨在通过实例帮助他们理解这两个概念。排列是有序的组合,而组合则是无序的。在教学过程中,通过...
排列与组合是高中数学中的重要概念,主要涉及从一定数量的元素中选择或安排元素的方法。在实际问题中,这两个概念经常被用来解决各种选择和排列的问题。 首先,我们要理解排列和组合的基本定义。排列是从n个不同...
### 排列与组合知识点解析 #### 一、教学背景及目标 本次教学内容选自人教版《义务教育课程标准实验教科书数学(二年级上册)》第100页,主要针对二年级学生的认知特点设计。通过具体情境引入,激发学生的学习兴趣...
一年级数学排列与组合PPT课件.pptx
排列组合是高中数学中的核心概念,特别是在解决实际问题和应对高考时显得尤为重要。在高考数学(理科)的一轮复习中,深入理解和掌握排列与组合的知识是必不可少的。 首先,我们要明确排列与组合的区别。排列是关于...
这需要计算所有可能的组合,考虑到题目具有放回性质,因此需结合排列组合知识进行解答。 总的来说,排列与组合是高中数学中的核心概念,不仅要求学生熟练掌握计算规则,更需要他们具备灵活应用这些规则解决实际问题...
排列与组合是组合数学的基本概念,广泛应用于概率论、统计学和计算机科学等领域。这两个概念是计数原理的基础,帮助我们解决如何确定不同选择或排列的数量问题。 **一、两个根本计数原理** 1. **分类加法计数原理*...