题目大意:按字典次序输出全排列,不要重复的。
解题思路:全排列,set容器。
全排列代码:
#include <iostream>
#include <cstring>
using namespace std;
int n, vis[1005], num[1005];
void dfs(int d)
{
if (d >= n){
for (int i=0; i<n; i++)
printf("%d ", num[i]);
printf("\n");
}
else{
for (int i=0; i<n; i++)
if (!vis[i]){
vis[i] = 1;
num[d] = i+1;
dfs(d+1);
vis[i] = 0;
}
}
}
int main()
{
while (scanf("%d", &n)!=EOF){
memset(vis, 0, sizeof(vis));
dfs(0);
}
return 0;
}
ac代码:
#include <iostream>
#include <cstring>
#include <set>
using namespace std;
int n, len, cnt, vis[20];
char ch[20], map[20], re[20];
set <string>se;
set <string>::iterator it;
void dfs(int n)
{
if (n == len){
re[len] = '\0';
se.insert(re);
return ;
}
else{
for (int i=0; i<len; i++)
if (!vis[i]){
vis[i] = 1;
re[n] = map[i];
dfs(n+1);
vis[i] = 0;
}
}
}
int main()
{
scanf("%d", &n);
while (n--){
scanf("%s", ch);
len = strlen(ch);
memset(vis, 0, sizeof(vis));
for (int i=0; i<len; i++)
map[i] = ch[i];
cnt = 0;
dfs(0);
for (it=se.begin(); it!=se.end(); it++)
cout << *it << endl;
printf("\n");
se.clear();
}
return 0;
}