| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 818 人关注过本帖
标题:排列组合问题
只看楼主 加入收藏
蓝xuan
Rank: 4
等 级:业余侠客
帖 子:81
专家分:211
注 册:2012-3-31
结帖率:100%
收藏
已结贴  问题点数:40 回复次数:9 
排列组合问题
排列组合问题:
1、输入n个数(不重复),求n个数字的全排列
   如:n=3  全排列的数字为 1 2 3 则输出 123 132 213 231 321 312  
2、输入n和k(n》=k)求n个数字的(n,k)排列
   如n=3,k=2 输入的三个数位1 2 3 则输出 12 13 23
3、3、输入n个数(有重复),求n个数字的全排列
   如:n=3 全排列的数字为1 1 2 则输出 112 121 211
#include<stdio.h>
static int num = 0;
void mySwap(int *a, int *b) {
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
void fullArray(int a[], int m, int n) {
   
    int i;
    if(m == n) {
        for(i=0;i<n;i++) {
            printf("%d ",a[i]);
        }
        num++;
        printf("\n");
    }
    else {
        for(i = m; i<n; i++) {
            mySwap(&a[m],&a[i]);
            fullArray(a,m+1,n);
            mySwap(&a[m],&a[i]);
        }
    }
}
int  main() {
    int k=1,n,j=0,i=0;
    int *array;
    scanf("%d",&n);
    array = (int *)malloc(sizeof(int)*n);
    for(i=0;i<n;i++) {
        array[i] = k;
        k++;
    }
    printf("\n");
    fullArray(array,0,n);
    printf("一共有%d种排列\n",num);
    return 0;
}
第一题做出来了,第二题有思路但是一直没实现啊,第三题没做出来啊啊。。。。求助!!
搜索更多相关主题的帖子: include 
2013-04-01 23:15
蓝xuan
Rank: 4
等 级:业余侠客
帖 子:81
专家分:211
注 册:2012-3-31
收藏
得分:0 
自己顶起来。。。。求助啊啊啊啊啊
2013-04-02 12:46
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:1 
你先说说思路吧,


[fly]存在即是合理[/fly]
2013-04-02 13:22
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:6 
用递归应该不好实现后面两个问题
可以用一个等长的辅助数组 用于记录与其同一位置的元素在排列序列中的出现位置
这样的话 三个问题的处理方法分别是
1. 对所有数组元素处理
2. 只处理前k个元素
3. 在处理时 如果相同元素被选中 则应满足 排列序列中的相同元素的先后顺序 与 原序列一致 这样可保证不出现相同排列
你先看看我想的对不对 如果对的话 你试试看 行不行

人生是一场错过 愿你别蹉跎
2013-04-02 14:15
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:10 
1.输入n个数,输入开始的数m
2.排序
3.判断for(i = 0; i < n; i++) if(i == m) 记录a[m]到a[n - 1]的数, 从0开始赋值给b[]
4.调用perm算法   Perm(b, 0, n - 1 - m);
这是我的思路,不知道有没有帮助,等下就要上课了...呵呵

仰望星空...........不忘初心!
2013-04-02 14:26
tompobing
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:260
专家分:809
注 册:2012-12-9
收藏
得分:1 
..
2013-04-03 19:56
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:0 
   如n=3,k=2 输入的三个数位1 2 3 则输出 12 13 23,,,你这是要求第一个数必须小于第一个数吗?感觉思路就是利用n作为输出数的控制,k进行循环条件的控制

Maybe
2013-04-03 20:10
梅可伟梅可伟
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:69
专家分:180
注 册:2013-3-11
收藏
得分:8 
第3个,自己写的用整型数组和递归来处理的,建议用字符串来处理#include <stdio.h>
#include <string.h>
#define N 2
int b[1000][N+1]={0};
void func(int a[],int k,int m,int &j)
{
    int i,t;
    if(k==m)
    {
        for(i=0;i<=m;i++)
            b[j][i]=a[i];
        j++;
        
    }
    else
    {
        for(i=k;i<=m;i++)
        {
            {t=a[k];a[k]=a[i];a[i]=t;}
            func(a,k+1,m,j);   
            {t=a[k];a[k]=a[i];a[i]=t;}
        }
    }
}
void main()
{
    int a[10]={1,2,2,4,5,6,7,8,9,10},i,k,j=0,t,r=0;
    func(a,0,N,j);
    k=j;
    for(j=0;j<k-1;j++)
    {
        for(i=j+1;i<k;i++)
        {
            for(t=0;t<N+1;t++)
            {
                if(b[j][t]!=b[i][t]) break;
            }
            if(t>=N+1) b[j][0]=48;
            
        }
    }
    for(j=0;j<k;j++)
    {
        if(b[j][0]!=48)
        {
            for(i=0;i<N+1;i++)
                b[r][i]=b[j][i];
            r++;
        }
        
    }


            
    for(j=0;j<r;j++)
    {
        for(i=0;i<N+1;i++)
            printf("%3d",b[j][i]);
        printf("\n");
    }
}
2013-04-05 18:36
happycolt
Rank: 2
等 级:论坛游民
帖 子:5
专家分:18
注 册:2013-4-6
收藏
得分:12 
回复 楼主 蓝xuan
第二问:
#include<stdio.h>
#define N 100

int a[N];


void combine(int m,int n,const int temp,int head)
{
int i,j;
for(i=head;i<=m-n+1;i++)
{
a[temp-n]=i;
if(n>1)
combine(m,n-1,temp,i+1);
else
{
for(j=0;j<temp;j++)
printf("%d",a[j]);
printf("\n");
}
}
}

void main()
{
combine(5,4,4,1);
getch();
}
2013-04-06 14:04
happycolt
Rank: 2
等 级:论坛游民
帖 子:5
专家分:18
注 册:2013-4-6
收藏
得分:2 
回复 8楼 梅可伟梅可伟
你的代码写的有点繁琐
2013-04-06 14:06
快速回复:排列组合问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018149 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved