关于字符串排列组合代码
#include<stdio.h>#include<algorithm>
using namespace std;
int ans;
int ok(char str[],int a,int b)
{
if(b>a)
for(int i=a;i<b;i++)
if(str==str)
return 0;
return 1;
}
void perm(char str[],int k,int m)
{
int i;
if(k==m)
{
ans ++;
for(i=0;i<=m;i++)
{
printf("%c",str);
}
printf("\n");
}
else
{
for(i=k;i<=m;i++)
if(ok(str,k,i))
{
swap(str,str);
perm(str,k+1,m);
swap(str,str);
}
}
}
int main(int argc,char*argv[])
{
char str;
int n;
while(scanf("%d",&n)!=EOF)
{
ans = 0;
scanf("%s",str);
perm(str,0,n-1);
printf("%d\n",ans);
}
return 0;
}
这是排列组合的代码, 比如输入3 abc则会输出 abc acb bac bca cab cba 6。 Ps :3是abc的字符串数6 是排列出结果的个数 。
求鱼油们帮我把代码注释一下, 这是老师上课讲的代码 可我一直不理解 一下午脑子都是这个问题 都快炸锅了 今晚弄不懂会睡不着T T
/*注释写好,看不看得懂就看你自己了,一句话,写完注释我想骂人,哪有这样写代码的,一定规范性都没有,特别是OK()这个函数。至于鱼币你给不给我,你觉得好就给,觉得不行就算了,我也是没事干才帮你写的。想走程序员这条路,还是要靠自己努力啊。*/
#include<stdio.h> //头文件
#include<algorithm>
using namespace std;
int ans; //定义全局变量用来统计组合的个数(也就是6)
int ok(char str[],int a,int b)
{
if(b>a)
for(int i=a;i<b;i++) //不知道你这部分的分号在哪里,所以没法解释。其实我懒得去看。
if(str==str)
return 0;
return 1;
}
void perm(char str[],int k,int m) //perm函数
{
int i;
if(k==m) //判断3是否等于1
{
ans ++; // ans累加
for(i=0;i<=m;i++) //循环
{
printf("%c",str); // 如果为输入一个字符 直接打印出来
}
printf("\n");
}
else //3 不等于 1
{
for(i=k;i<=m;i++)//循环3次
if(ok(str,k,i)) //判断语句,为真执行下面语句
{
swap(str,str); //swap交换函数,估计你忘记写上出去所以没法解释了。
perm(str,k+1,m); //继续跳转到perm函数
swap(str,str); //swap交换函数,估计你忘记写上出去所以没法解释了。
}
}
}
int main(int argc,char*argv[]) //主函数
{
char str; //定义str
int n;
while(scanf("%d",&n)!=EOF) //输入一个数不等于EOF
{
ans = 0; //ans = 0
scanf("%s",str); //输入字符串的个数,假设输入3
perm(str,0,n-1); //跳转到perm函数
printf("%d\n",ans); //打印ans的累加次数
}
return 0;
}
请问代码中的swap(int a,int b)是一个什么样的函数,功能是什么,C++自带的吗? 本帖最后由 buxiaode 于 2015-6-2 12:00 编辑
此程序有点难度,是采用 递归 方式来运行的,需要 一些数学知识,先说一下 :
全排序: 设R={r1,r2,...,rn}是要进行排列的n个元素,Ri = R-{ri}. 集合 X 中元素的全排列记为Perm(X)。
(ri)Perm(X)表示在全排列Perm(X)的每一个排列上加前缀ri得到的排列。
R的全排列可归纳定义如下:
当 n = 1 时, Perm(R) = (r),其中r 是集合R中唯一的元素;
当 n >1 时, Perm(R)有 (r1)Perm(R1),(r2)Perm(R2),.......,(rn)Perm(Rn)构成
看看
页:
[1]