先是一个递归的排列,顺便复习以下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. 连接问题:构建道路连接多个点...
此外,排列与组合与二项式定理紧密相关,对提高学生综合素质有着深远的影响。 其次,教材在内容处理上,注重了情感、态度和价值观的培养。随着课程的深入,目标逐渐提升,内容的丰富性和难度也呈现出递增趋势。教材...
在这个阶段引入排列与组合的概念,不仅能够培养学生的逻辑思维能力和有序思考的方法,还能够帮助他们理解数学的组合性和多样性。接下来,我将根据所提供的概要内容,详细地描述三年级数学广角排列与组合PPT学习教案...
在高中数学的教学中,排列与组合是重要的一环,尤其对于新人教A版选修2-3的课程,这部分内容常常让许多学生感到困难。排列与组合的概念与解题方式有其独特性,不同于传统的数学问题,这使得初次接触的学生需要时间...
排列与组合专题教案设计 排列与组合是概率论与数理统计中基本的计数方法,是数学领域中重要的基础知识点。本专题教案设计的核心在于帮助学生深入理解排列的定义及其计算方法,以便于他们能准确掌握如何从一定数量的...
在提供的文档中,题目涉及了多个排列组合的具体应用,包括抽取不同元素、任务分配、概率计算等。 1. 第一题是关于素数的选择问题,其中涉及到组合的概念。从10个不同的素数中选取两个不同的数,根据组合公式C(n, k)...
掌握排列组合的知识,不仅仅是要记住公式和区别,更重要的是培养解决排列组合问题的能力。学生需要学会运用分类讨论、分析问题的能力,以及分步解决问题的策略。在实际问题中,比如多人就座或物品排列问题,常常需要...
排列与组合是数学中的基本概念,特别是在概率论和统计学中有着广泛的应用。这个PPT学习教案主要针对二年级的学生,旨在通过实例帮助他们理解这两个概念。排列是有序的组合,而组合则是无序的。在教学过程中,通过...
排列与组合是高中数学中的重要概念,主要涉及从一定数量的元素中选择或安排元素的方法。在实际问题中,这两个概念经常被用来解决各种选择和排列的问题。 首先,我们要理解排列和组合的基本定义。排列是从n个不同...
### 排列与组合知识点解析 #### 一、教学背景及目标 本次教学内容选自人教版《义务教育课程标准实验教科书数学(二年级上册)》第100页,主要针对二年级学生的认知特点设计。通过具体情境引入,激发学生的学习兴趣...
一年级数学排列与组合PPT课件.pptx
这需要计算所有可能的组合,考虑到题目具有放回性质,因此需结合排列组合知识进行解答。 总的来说,排列与组合是高中数学中的核心概念,不仅要求学生熟练掌握计算规则,更需要他们具备灵活应用这些规则解决实际问题...