Exercise(16):排列组合

/*
        排列组合
    问题描述:
        给定n个数,求出1,2,...,n的所有排列组合。
        (使用深度优先搜索算法)

        输入描述 InputDescription
        第一行输入整数n(0<n<=100)

        输出描述 OutputDescr
        每行n个用空格隔开的数,表示一种排列组合 

        样例输入 SampleInput
        3 

        样例输出 SampleOutput
        1 2 3
        1 3 2
        2 1 3
        2 3 1
        3 1 2
        3 2 1 

        问题分析:
            有n个数,抽象为n个盒子,每个盒子放1~n之中的一数。
            1、在盒子一里放入1、盒子二放入2、盒子三放入3.   得 组合1 (1,2,3)
            2、取回:盒子三的3,盒子二的2,
               放入:3放入盒子二,2放入盒子三.                得 组合2 (1,3,2)
            3、取回:盒子三的2,盒子二的3,盒子一的1,
               放入:2放入盒子一,1放入盒子二,3放入盒子三. 得 组合3 (2,1,3)
            4、取回:盒子三的3,盒子二的1,
               放入:3放入盒子二,1放入盒子三.                得 组合4 (2,3,1)
            5、取回:盒子三的1,盒子二的3,盒子一的2
               放入:3放入盒子一,1放入盒子二,2放入盒子三. 得 组合5 (3,1,2)
            6、取回:盒子三的2,盒子二的1.
               放入:2放入盒子二,1放入盒子三.                得 组合6 (3,2,1)
        参照:<<啊哈!算法>> P78

*/
#include <iostream>
using namespace std;
int n=0;
int arr[100] = {0};
bool mark[100];         // 默认值为false 

void DFS(int step)
{
    if(step==n+1)       // 如果在第n+1个盒子前,表示前n个盒子已经放好数
    {
        for(int i=1;i<=n;i++)   // 打印该组合
            cout<<arr[i]<<ends;
        cout<<endl;
        return;
    }   

    // 放在盒子step中的数时哪个呢?
    // 从1~n一一尝试下
    for(int i=1;i<=n;i++)
    {
        if(!mark[i])            // 判断数i是否已放置
        {
            arr[step] = i;      // 把数i放入盒子step中
            mark[i] = true;     // 标记数i已放置
            DFS(step+1);        // 再放决定下一个盒子(step+1)应放什么数
            mark[i] = false;    // 把刚刚尝试过的数拿出来,进行另外的尝试
        }
    }
    return;
}

int main()
{
    cin>>n;                     // n表示n个数(1~n)
    if(n<=0 || n>100) return -1;

    DFS(1);                     // 从第一个盒子开始尝试 

    return 0;
}
时间: 2024-08-03 22:11:01

Exercise(16):排列组合的相关文章

排列组合问题之圆形分布

1.问题1.1 团团坐有一张圆桌,坐了A,B,C,D四个人,已知,D在A的右边,C在D的对面,请问A,B,C,D,的坐次? 解答:这个问题相对简单,我们纸上画一画,就能画出他们的可能的位置了 但是,可能还有一种解,比如我们把A,B,C,D依次右转一个位,也是满足条件的,而且只要保持他们的相对位置不变,依次右转n个位都是问题的解,而且还有个有趣的事情,当他们转了一圈(即右转4个位)后,他们右回到原位了 2.圆形分布上面这个问题就是一种圆形分布,那么他和直线分布的区别在哪里呢?又有什么联系呢?上面文

【noi 2.6_9288】&amp;【hdu 1133】Buy the Ticket(DP / 排列组合 Catalan+高精度)

题意:有m个人有一张50元的纸币,n个人有一张100元的纸币.他们要在一个原始存金为0元的售票处买一张50元的票,问一共有几种方案数. 解法:(学习了他人的推导后~) 1.Catalan数的应用7的变形.(推荐阅读:http://www.cnblogs.com/chenhuan001/p/5157133.html).P.S.不知我之前自己推出的公式“C(n,m)*C(2*m,m)/(m+1)*P(n,n)*P(m,m)”是否是正确的. (1)在不考虑m人和n人本身组内的排列时,总方案数为C(m+

LightOJ1005 Rooks(DP/排列组合)

题目是在n*n的棋盘上放k个车使其不互相攻击的方案数. 首先可以明确的是n*n最多只能合法地放n个车,即每一行都指派一个列去放车. dp[i][j]表示棋盘前i行总共放了j个车的方案数 dp[0][0]=1 转移就是从第i-1行转移到第i行,对于第i行要嘛放上一个车要嘛不放,放的话有n-j-1种方法.即dp[i][j]=dp[i-1][j]+dp[i-1][j-1]*(n-j-1). 1 #include<cstdio> 2 #include<cstring> 3 using na

排列&组合

What's the Difference? In English we use the word "combination" loosely, without thinking if the order of things is important. In other words: "My fruit salad is a combination of apples, grapes and bananas" We don't care what order the

排列组合+组合数取模 HDU 5894

1 // 排列组合+组合数取模 HDU 5894 2 // 题意:n个座位不同,m个人去坐(人是一样的),每个人之间至少相隔k个座位问方案数 3 // 思路: 4 // 定好m个人 相邻人之间k个座位 剩下就剩n-(m+1)*k个座位 5 // 剩下座位去插m个不同的盒子==就等价n个相同的球放m个不同的盒子 6 // 然后组合数出来了 7 // 乘n的话是枚举座位,除m是去掉枚举第一个座位的时候,剩下人相邻的座位相对不变的情况 8 9 #include <iostream> 10 #incl

高中数学排列组合

一.特殊元素和特殊位置优先策略 例1.由0,1,2,3,4,5可以组成多少个没有重复数字五位奇数. 解:由于末位和首位有特殊要求,应该优先安排,以免不合要求的元素占了这两个位置. 先排末位共有 然后排首位共有 最后排其它位置共有 由分步计数原理得 二.相邻元素捆绑策略 例2. 7人站成一排 ,其中甲乙相邻且丙丁相邻, 共有多少种不同的排法. 解:可先将甲乙两元素捆绑成整体并看成一个复合元素,同时丙丁也看成一个复合元素,再与其它元素进行排列,同时对相邻元素内部进行自排.由分步计数原理可得共有种不同

【原创】开源.NET排列组合组件KwCombinatorics使用(三)——笛卡尔积组合

你还可以参考本博客其他.NET开源项目的相关文章: [原创]彩票预测算法:离散型马尔可夫链模型          Newlife XCode组件资源目录汇总[2013年版] [原创]开源.NET下的XML数据库介绍及入门          [原创].NET开源压缩组件介绍与入门 [开源].NET开源表达式计算组件介绍与使用          [原创]开源Word读写组件DocX介绍与入门 [原创]Matlab.NET混编调用Figure窗体                [原创]Matlab与.

java中的排列组合

? 1 使用之前需要声明一个Combine的对象,调用startCombile方法,可返回想要的组合数或者个数,参数介绍很重要 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 <br> public class Combine {     p

【CF521C】【排列组合】Pluses everywhere

Vasya is sitting on an extremely boring math class. To have fun, he took a piece of paper and wrote out nnumbers on a single line. After that, Vasya began to write out different ways to put pluses ("+") in the line between certain digits in the