/*题目:求数的全排列。用dfs方法。转化为dfs模型:手中有n张牌,分别为1~n,面前有n个箱子,
输出所有的放法。
*/
#include <cstdio>
#include <cstring>
#define N 10
using namespace std;
int n;
int vis[N] = { 0 }, a[N] = { 0 };//数组vis标记该箱子是否已有纸牌,a存储每个箱子对应的纸牌的数值。
void dfs(int step)
{
if (step == n + 1)//dfs的临界条件,走到第n+1个箱子面前
{
for (int i = 1; i <= n; i++)//输出全排列
printf("%d", a[i]);
printf("\n");
return;
}
for (int i = 1; i <= n; i++)//每走下一步都考虑下n种情况,即有n种选择箱子的方法
{
if (!vis[i])//判断当前箱子是否放过
{
a[step] = i;//把当前箱子位置赋值给目前的步数对应的数组a
vis[i] = 1;
dfs(step + 1);//继续下一步搜索
vis[i] = 0;
}
}
return;
}
int main()
{
while (scanf("%d", &n) != EOF && n)//输入有多组,当输入0时停止输入
{
memset(vis, 0, sizeof(vis));
memset(a, 0, sizeof(a));
dfs(1);//从第一个箱子开始
}
return 0;
}
求数的全排列
最新推荐文章于 2021-09-06 15:49:53 发布