Exercise(16):排列组合

来源:互联网 发布:淘宝特殊类型订单删除 编辑:程序博客网 时间:2024/05/01 05:22
/*        排列组合     问题描述:        给定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;}
0 0
原创粉丝点击