Description
对于数组[1, 2, 3],他们按照从小到大的全排列是
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
现在给你一个正整数n,n小于8,输出数组[1, 2, …,n]的从小到大的全排列。
Input
输入有多行,每行一个整数。当输入0时结束输入。
Output
对于每组输入,输出该组的全排列。每一行是一种可能的排列,共n个整数,每个整数用一个空格隔开,每行末尾没有空格。
Sample Input
2 3 0
Sample Output
1 2 2 1 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
#include<bits/stdc++.h>
using namespace std;
int main ()
{
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
int n;
while (~scanf("%d", &n) && n!=0){
do {
for(int i = 1; i <= n; i++)
printf(i == n ? "%d\n" : "%d ", a[i]);
}
while(next_permutation(a+1, a + n+1));
}
return 0;
}
常规DFS解法
#include <stdio.h>
#include <string.h>
bool vd[10];
int ans[10];
void dfs(int n, int m){
for (int i = 1; i <= n; i++){
if (!vd[i]){
vd[i] = true;
ans[m] = i;
dfs(n, m+1);
vd[i] = false;
}
}
if (m == n){
printf("%d", ans[1]);
for (int i = 2; i <= m; i++)
printf(" %d", ans[i]);
printf("\n");
}
}
int main()
{
int n;
while (~scanf("%d", &n) && n != 0){
memset(vd, 0, sizeof(vd));
memset(ans, 0, sizeof(ans));
dfs(n, 1);
}
return 0;
}