鱼C论坛

 找回密码
 立即注册
查看: 1384|回复: 4

关于字符串排列组合代码

[复制链接]
发表于 2015-3-24 21:42:42 | 显示全部楼层 |阅读模式
40鱼币
#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[i]==str[b])
     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[i]);
              }
          printf("\n");
         }
else

    {
     for(i=k;i<=m;i++)
       if(ok(str,k,i))
          {
            swap(str[k],str[i]);
            perm(str,k+1,m);
            swap(str[k],str[i]);
           }
    }
}

int main(int argc,char*argv[])
{
    char str[1000];
    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


最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-24 21:42:43 | 显示全部楼层
/*注释写好,看不看得懂就看你自己了,一句话,写完注释我想骂人,哪有这样写代码的,一定规范性都没有,特别是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[i]==str[b])
     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[i]); // 如果为输入一个字符 直接打印出来
              }
          printf("\n");
         }
else   //3 不等于 1

    {
     for(i=k;i<=m;i++)  //循环3次
       if(ok(str,k,i))        //判断语句,为真执行下面语句
          {
            swap(str[k],str[i]);         //swap交换函数,估计你忘记写上出去所以没法解释了。
            perm(str,k+1,m);                //继续跳转到perm函数
            swap(str[k],str[i]);        //swap交换函数,估计你忘记写上出去所以没法解释了。
           }
    }
}

int main(int argc,char*argv[])                //主函数
{
    char str[1000];                        //定义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;

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-6 19:25:13 | 显示全部楼层
请问代码中的swap(int a,int b)是一个什么样的函数,功能是什么,C++自带的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-2 08:35:50 | 显示全部楼层
本帖最后由 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)构成



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-18 19:27:54 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 01:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表