/*
排列组合
问题描述:
给定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-10-10 17:32:08