题目
1458: 全排列
Time Limit: 1 Sec
Memory Limit: 128 MB
Submit: 617
Solved: 127
[
Submit][
Status][
Web Board]
1458: 全排列
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 617 Solved: 127
[ Submit][ Status][ Web Board]
Description
我们知道,正整数1~n的排列方案数为排列数A(n,n) = n!
请按字典序输出1~n的所有排列方式
请按字典序输出1~n的所有排列方式
Input
多组数据
每组数据有一行一个整数n(0<n<10)
请处理到文件末尾
每组数据有一行一个整数n(0<n<10)
请处理到文件末尾
Output
按字典序输出1~n的所有排列方案,一行一个方案
Sample Input
3
Sample Output
123
132
213
231
312
321
HINT
字典序的含义可以从样例中猜出...
思路
1. next_permutation
2. dfs
细节
由于输出比较多(>>10^5次),输出用cout 会超时。。。反正我第一次用了一个cout 超时了。。。。
代码
#include <bits/stdc++.h>
using namespace std;
#define MAX_N 12
int n[MAX_N];
int main()
{
int N;
while (~scanf("%d", &N) ) {
for (int i = 1; i <= N; i++) {
n[i-1] = i;
}
do {
for (int i = 1; i <= N; i++) {
printf("%d", n[i-1]);
}
printf("\n");
//cout << endl; 会超时
} while (next_permutation(n, n+N));
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define MAX_N 12
bool used[MAX_N];
int perm[MAX_N];
void permutation(int pos, int n) {
if (pos == n) {
for (int i = 1; i < n; i++) {
printf("%d", perm[i]);
}
printf("\n");
return;
}
for (int i = 1; i < n; i++) {
if (!used[i]) {
perm[pos] = i;
used[i] = true;
permutation(pos + 1, n);
used[i] = false;
}
}
return;
}
int main(void)
{
int N;
while (~scanf("%d", &N) ) {
memset(used, false, sizeof(used));
permutation(1,N+1);
}
return 0;
}